본문 바로가기

Springboot

SpringApplication

Spring Initializr를 사용하면 생성되는 Application 클래스

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
}

커스터마이징

하고 싶다면 로컬 인스턴스를 만들어야 한다.

SpringApplication app = new SpringApplication(Application.class);

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        
        app.setBanner(new Banner() {
            @Override
            public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
                out.println("============================");
                out.println("Jueun");
                out.println("============================");
            }
        });
        // app.setBannerMode(Banner.Mode.OFF); // 배너 모드 끄기

        app.run(args);
    }
}

Builder 사용해보기.

@SpringBootApplication
public class Application2 {

    public static void main(String[] args) {
        new SpringApplicationBuilder()
        .sources(Application2.class)
        .run(args);
    }

}

 

ApplicationEvent 등록

// @Component 빈으로 등록하면 이벤트가 발생되었을 때 자동으로 실행이 된다.

@Component // 빈으로 만들었어요
public class SampleListener2 implements ApplicationListener<ApplicationStartedEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
        System.out.println("======================");
        System.out.println("started");
        System.out.println("======================");
    }
}


// 하지만 아래의 경우, applicationContext가 발생하기 이전에 실행되는 이벤트라서 리스러가 동작을 안한다.
// 이런 경우에는 직접 등록을 해주어야 한다. SpringApplication에. ㅡ> Application3 클래스에서 작동.

public class SampleListener implements ApplicationListener<ApplicationStartingEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
        System.out.println("======================");
        System.out.println("Application is starting");
        System.out.println("======================");
    }
}
public class Application3 {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.addListeners(new SampleListener());
        app.run(args);
    }
}

 

 

WebApplicationType 설정

app.setWebApplicationType(WebApplicationType.NONE); // 웹 모드 끄기

 

애플리케이션 아규먼트 사용하기

ApplicationArguments를 빈으로 등록해 주니까 가져다 쓰면 된다.

@Component
public class Argument {
    // 생성자의 파라미터가 빈일때는 스프링이 자동으로 주입해준다.

    public Argument(ApplicationArguments arguments) {
        System.out.println("foo: " + arguments.containsOption("foo")); // VM options: -Dfoo
        System.out.println("bar: " + arguments.containsOption("bar")); // Program arguments: --bar
        // 출력값
        // foo: false
        // bar: true
    }
}

 

ApplicationRunner 

애플리케이션 실행한 뒤 뭔가 실행하고 싶을 때 ApplicationRunner (추천) 또는 CommandLineRunner을 상속받아 구현할 수 있다. 또한 @Order순서를 지정하여 사용할 수 있다.

@Component
@Order(1) // 순서 지정 가능. 숫자 낮은 게 먼저 실행
public class Runner implements ApplicationRunner {
    // 고급진 API를 통해 argument를 쓸 수 있음. (추천)
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("@Order(1)");
        System.out.println("foo: " + args.containsOption("foo")); // VM options: -Dfoo
        System.out.println("bar: " + args.containsOption("bar")); // Program arguments: --bar
    }
}
@Component
@Order(2)
public class Runner2 implements CommandLineRunner {
    // low하게 argument에 접근함
    @Override
    public void run(String... args) throws Exception {
        Arrays.stream(args).forEach(System.out::println);
        System.out.println("@Order(2)");
    }
}

출력 결과이다.

 

관련 레퍼런스: docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-spring-application