Dev

[Spring Boot] @SpringBootApplication

Ryan Woo 2019. 12. 9. 21:07

@SpringBootApplication 

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
    	SpringApplication.run(Application.class, args);
    }
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
	// ...
}

@Target
@Retention
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

여기서 @Target, @Retention, @Documented, @Inherited 은 메타 어노테이션이다.

더보기

Annotations applied to other annotations (also known as "Meta Annotations"):

  • @Retention - Specifies how the marked annotation is stored, whether in code only, compiled into the class, or available at runtime through reflection.
  • @Documented - Marks another annotation for inclusion in the documentation.
  • @Target - Marks another annotation to restrict what kind of Java elements the annotation may be applied to.
  • @Inherited - Marks another annotation to be inherited to subclasses of annotated class (by default annotations are not inherited to subclasses).
  • @Retention-코드로 표시되거나 클래스로 컴파일되거나 리플렉션을 통해 런타임에 사용 가능한지 여부에 관계없이 표시된 주석이 저장되는 방법을 지정합니다.
  • @Documented-문서에 포함 할 다른 주석을 표시합니다.
  • @Target-주석이 적용될 수있는 Java 요소의 종류를 제한하기 위해 다른 주석을 표시합니다.
  • @Inherited-주석이 달린 클래스의 서브 클래스에 상속 될 다른 주석을 표시합니다 (기본적으로 주석은 서브 클래스에 상속되지 않습니다).

출처 https://en.wikipedia.org/wiki/Java_annotation

 

주요 어노테이션인 @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan 을 살펴보면

@SpringBootConfiguration

@EnableAutoConfiguration

  • 스프링 프레임워크에서 많이 쓰이는 스프링 bean들을 자동적으로 컨테이너에 등록
  • spring-boot-autoconfigure-2.x.x.RELEASE.jar\META-INF\spring.factoiesorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\아래 @Configuration 있는 클래스를 모두 Load

@ComponentScan

  • @ComponentScan 이 붙은 클래스가 위치해있는 현재 패키지 기준으로 그 아래 패키지를 찾아 stereotype annotation(@Component, @Repository, @Service, @Controller)이 붙은 클래스를 스프링 빈으로 등록.

참고 https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-using-springbootapplication-annotation