- [Spring boot]#1 SpringApplication 목차
SpringApplication.run(SpringName.class,args);
->이렇게하면 스프링 애플리케이션에 제공하는 다양한 커스터마이징 기능을 사용하기 어렵다
따라서
인스턴스를 만들고 run하는 방법을 사용하면 위 코드와 결과는 같지만 커스터마이징 기능을 사용할 수 있다.
SpringApplication app = new SpringApplication(SpringintitApplication.class);
app.run(args);
->기본적으로 info level이 low레벨이다
| 이벤트 리스너( Event Listener )
스프링 부트를 실행할 시 구동되는 단계마다 여러 이벤트들이 발생하게 됩니다.
스프링부트에서는 프로그래머가 이 이벤트들을 나타내는 객체를 인자로 받아 각 단계마다 원하는 처리를 할 수 있습니다.
스프링 부트가 구동될 때 여러 이벤트들이 있지만 그 중에서 ApplicationStartingEvent 와 ApplicationStartedEvent를 예로들어 알아보겠습니다.
ApplicationStartingEvent는 다음 코드를 통해 처리할 수 있습니다.
@Component
public class AppStartedSampleListener implements ApplicationListener<ApplicationStartingEvent> {
@Override
public void onApplicationEvent(ApplicationStartingEvent event) {
System.out.println("=====================");
System.out.println("Application starting");
System.out.println("=====================");
}
}
주의 할 것은 ApplicationStartingEvent는 스프링 컨테이너가 만들어지기 전에 생성되는 이벤트입니다.
이 이벤트를 처리하려면 다음과 같이 SpringApplication 객체에 해당 리스너를 추가해야합니다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(new SampleListener());
application.run(args);
}
}
->addListeners로 생성해줘야합니다 !!!
ApplicationStartedEvent를 포함한 스프링 컨테이너가 만들어진 이후에 생성되는 이벤트들은 아래와 같이 스프링 빈 등록을 통해 이벤트를 처리할 수 있습니다.
@Component
public class AppStartedSampleListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("=====================");
System.out.println("Application started");
System.out.println("=====================");
}
}
=======================
Application is starting
=======================
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.1.RELEASE)
(...)
=====================
Application started
=====================
| 스프링 부트 웹 어플리케이션 타입 지정
스프링 부트는 SpringApplication 객체를 통해 어플리케이션 타입을 지정할 수 있습니다. SpringApplication 객체는 스프링 컨테이너의 인터페이스인 ApplicationContext의 구현체를 프로그래머 대신 만들어줍니다. 프로그래머는 ApplicationContext의 구현체를 다음과 같은 방법으로 지정할 수 있습니다.
만약 Spring MVC와 Spring WebFlux가 둘 다 설정되있으면 Spring MVC가 우선 적용됩니다.
@SpringBootApplication
public class Application {
// 1. Servlet으로 설정 되있으면 AnnotationConfigServletWebServerApplicationContext (Spring MVC)
// 2. Servlet이 없으면 WebFlux로 되있으면 AnnotationConfigReactiveWebServerApplicationContext (Spring WebFlux)
// 3. 전부 없을 시 AnnotationConfigApplicationContext로 설정
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(new SampleListener());
application.setWebApplicationType(WebApplicationType.SERVLET); // 웹 어플리케이션 타입 지정
application.run(args);
}
}
| 스프링 부트 커맨드 인수 처리
스프링 부트는 스프링 부트 어플리케이션이 실행될 때 준 커맨드 인수 옵션을 수월하게 처리할 수 있습니다. 여기서 주목해야 할 것은 VM 옵션은 처리하지 않고 오직 커맨드 인수 옵션만 처리한다는 것입니다.
아래와 같이 옵션을 주게될 경우 스프링 부트는 아래 코드를 실행할 때 -Dfoo VM 옵션은 무시한 채 --bar을 처리하게 됩니다.
java -jar target\springboot-tutorial-1.0-SNAPSHOT.jar -Dfoo --bar
@Component
public class AppRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("foo: " + args.containsOption("foo")); // VM 옵션은 arguments가 아님
System.out.println("bar: " + args.containsOption("bar"));
}
}
//결과
foo : false
bar : true
'Spring > Spring boot' 카테고리의 다른 글
[Spring boot]Logging이란? (0) | 2020.01.21 |
---|---|
[Spring boot]properties-스프링 부트 외부 설정 및 설정값 검증 (0) | 2020.01.21 |
스프링부트(Spring Boot) HTTPS 구축, HTTP2, 다중 커넥터 설정 (0) | 2020.01.20 |
[Spring-boot]스프링 부트 자동 설정 @ConditionalOnMissingBean, @ConfigurationProperties (0) | 2020.01.20 |
[Spring-boot]스프링 부트 자동 설정 만들기 : Starter, AutoConfigure (0) | 2020.01.19 |