반응형
스프링 어플리케이션을 시작할때 어플리케이션이 뜰때 초기 구동시켜줘야하는 코드들이 있을 수 있다.
이 때 해결 방법이
CommandLineRunner, ApplicationRunner, @EventListener 방법으로 초기 실행코드를 구현 할 수 있다.
@Component //component scanning에 의한 방식으로 빈을 등록하는 방법
public class MyCLRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("CommandLineRunner Args: " + Arrays.toString(args));
}
}
또는 @Bean 으로 사용 가능
@Bean
public CommandLineRunner myCLRunner() {
return args -> System.out.println("Hello Lambda CommandLineRunner!!");
}
구동시 파라미터를 다음과 같이 받을 수 있다. 아래 방식은 ApplicationRunner 도 동일하다.
$ java -jar target/demo-0.0.1-SNAPSHOT.jar abc 123
2. ApplicationRunner
CommandLineRunner 와 사용법은 똑같지만 다른 것은 파라미터 타입이 다른것 뿐이다.
ApplicationRunner 가 더 최근에 나온 방식이다.
@Component
public class DemoApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("ApplicationRunner Args: " + Arrays.toString(args.getSourceArgs()));
}
}
@Bean
public ApplicationRunner myApplicationRunner() {
return args -> System.out.println("Hello ApplicationRunner");
}
ApplicationRunner가 CommandLineRunner보다 일찍 실행된다.
다음과 같이 만든 초기구동 컴포넌트들이 실행순서가 이슈가 있을 경우 순서를 지정할 수 있다,
@Order(1)
@Component
public class DemoCommandLineRunner implements CommandLineRunner { ...
@Order(2)
@Component
public class DemoApplicationRunner implements ApplicationRunner { ...
3. @EventListener
이벤트 리스너가 최근에 나온 방식(4.2 이후)으로 이벤트를 연결해 초기 구동시 해당 클래스를 실행시킬 수 있다.
@SpringBootApplication public class SpringinitApplication {
public static void main(String[] args) { //ConfigurableApplicationContext : ApplicationContext를 코드에 의해서 재구성할 수 있도록 기능을 집어넣은 ApplicationContext.
ConfigurableApplicationContext ac = SpringApplication.run(SpringinitApplication.class, args);
ac.publishEvent(new MyEvent(ac,"My Spring Event"));
}
@EventListener(MyEvent.class)
public void onMyEvent(MyEvent myEvent){
System.out.println("Hello EventListener : " + myEvent.getMessage());
}
static class MyEvent extends ApplicationEvent {
private final String message; //원래 String message는 없는 건데 추가한 것임.
public MyEvent(Object source, String message) {
super(source); this.message = message;
}
public String getMessage(){
return message;
}
}
}
여러개 클래스의 경우 다음과 같이 실행할 수 있다.
@EvnetListener({MyEvent.class, ApplicationReadyEvent.class})
참고문헌https://www.daleseo.com/spring-boot-runners/ [스프링 부트 구동 시점에 특정 코드 실행 시키기]
https://jeong-pro.tistory.com/206[스프링 부트 애플리케이션에서 초기화 코드 3가지 방법]
반응형
'Spring > spring boot 및 기타' 카테고리의 다른 글
[SPRING] 스프링 스케쥴링 추가 @Scheduled (0) | 2020.09.27 |
---|---|
vscode 로 스프링부트 실행하기 (0) | 2020.09.18 |
[spring boot] mongodb 연결 및 _class 삭제 (5) | 2020.09.09 |
[SPRING BOOT] 스프링 부트 2.3 변경된 내용 (0) | 2020.06.21 |
[Spring Boot] 스프링 부트 시작 Main (0) | 2020.05.25 |