Skip to main content

SpringApplication (2)

· 4 min read

spring logo

Application Event

Application Event Listener 생성

package com.example;

import org.springframework.boot.context.event.ApplicationStartingEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

/**
* Application이 시작 될 때의 이벤트 리스너
*/
@Component
public class SampleListener implements ApplicationListener<ApplicationStartingEvent> {

@Override
public void onApplicationEvent(ApplicationStartingEvent arg0) {
System.out.println("=======================");
System.out.println("Starting Application...");
System.out.println("=======================");
}

}

그런데 위의 ApplicationStartingEvent는 @Component 어노테이션으로 Bean등록을 했음에도 ApplicationContext 생성 이전의, 완전 시작점의 이벤트라서 정상 작동하지 않는다. 따라서 Application에 따로 등록해야 한다.

package com.example;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.addListeners(new SampleListener());
app.run(args);
}
}
package com.example;

import org.springframework.boot.context.event.ApplicationStartingEvent;
import org.springframework.context.ApplicationListener;

/**
* Application이 시작 될 때의 이벤트 리스너
*/
public class SampleListener implements ApplicationListener<ApplicationStartingEvent> {

@Override
public void onApplicationEvent(ApplicationStartingEvent arg0) {
System.out.println("=======================");
System.out.println("Starting Application...");
System.out.println("=======================");
}

}

실행 결과 Spring Application Event 실습

Bean으로 등록한 이벤트의 경우

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.run(args);
}
}
package com.example;

import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

/**
* Application이 시작 될 때의 이벤트 리스너
*/
@Component
public class SampleListener implements ApplicationListener<ApplicationStartedEvent> {

@Override
public void onApplicationEvent(final ApplicationStartedEvent arg0) {
System.out.println("=======================");
System.out.println("Application Started....");
System.out.println("=======================");
}

}

실행 결과 spirng application event bean


Web Application Type

기본적으로 servlet으로 동작하며 이후 사용 의존성에 따라 설정이 필요하다. 의존성에 Spring MVC가 없고, WebFlux로 구성할 경우, REACTIVE로 변경해야 하며 WebApp이 아닌 경우에는 NONE으로 설정해야 한다.

Application 실행부에서 이를 조작할 수 있다.

package com.example;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setWebApplicationType(WebApplicationType.SERVLET);
app.setWebApplicationType(WebApplicationType.REACTIVE);
app.setWebApplicationType(WebApplicationType.NONE);
app.run(args);
}
}

Application Arguments

기본적으로 ApplicationArguments를 Bean으로 등록해준다. jar로 패키지된 Application을 실행할때 인자를 주기 위해서는 -- 를 사용하면 된다. -D옵션은 JVM 옵션임을 유의해야한다.

ApplicationRunner 혹은 CommandLineRunner를 통해 인자를 활용할 수 있다.

ApplicationRunner

package com.example;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class SampleRunner implements ApplicationRunner {

@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("is foo delivered : " + args.containsOption("foo"));
System.out.println("foo : " + args.getOptionValues("foo"));
}

}
java -jar /path/to/jar.jar --foo=bar

실행 결과 spring arguments ApplicationRunner 실행 결과

CommandLineRunner

package com.example;

import java.util.Arrays;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class SampleRunner implements CommandLineRunner {

@Override
public void run(String... args) throws Exception {
Arrays.stream(args)
.forEach(System.out::println);
}

}
java -jar /path/to/jar.jar --foo=bar

실행 결과 spring arguments CommandLineRunner 실행 결과

순서 지정도 가능하다. (@Order 어노테이션)