@SpringBootApplication
org.springframework.boot.autoconfigure
패키지 안에 들어있다.
@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 { ... }
@SpringBootConfiguration
현재 클래스가 Spring의 설정 파일임을 알려주는 어노테이션
- Configuration을 클래스에 적용하고 @Bean을 해당 클래스의 메소드에 적용하면 빈으로 등록된다.
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration @Indexed public @interface SpringBootConfiguration { @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true; }
@ComponentScan
- @Component @Configuration @Repository @Service @Controller @RestController
- 해당 어노테이션이 선언된 하위 패키지에서 위와 같은 Annotation을 찾아서 Bean으로 등록한다.
@EnableAutoConfiguration
어플리케이션에 추가된 설정들을 자동으로 추가해주는 어노테이션
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { StringENABLED_OVERRIDE_PROPERTY= "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {}; }
- 스프링 부트의 Application Context 설정을 자동으로 수행한다는 어노테이션으로,
META-INF/spring.factories
에 정의되어 있는 configuration 대상 클래스들을 빈으로 등록한다.
- 위 파일에 정리된 클래스들은 @Configuration 어노테이션이 없어도 자동으로 빈이 등록
- 추가로 개발자가 직접 이 spring.factories에 클래스를 적어 넣으면 Auto Configuration 대상에 포함된다.
Auto Configuration Mechanism
- 이렇게 많은 클래스들이 항상 다 빈으로 등록되면 엄청난 리소스 낭비가 된다.
AutoConfigurationImportSelector
클래스를 통해서 필터링 작업을 수행
AutoConfigurationImportSelector
의 Auto Configuration 필터링 과정 https://velog.io/@jwkim/spring-boot-springapplication-annotation
스프링 빈 등록 방식
1. 컴포넌트 스캔 대상
- @Component @Configuration @Repository @Service @Controller @RestController
2. Java 코드로 등록
@Configuration public class AppConfig { @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } }
- @Configuration 스프링 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다.
- 빈으로 등록하기 위해 인스턴슬르 생성하는 메소드 위에 @Bean을 명시한다.
@Bean vs @Component
- @Bean
- 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우 사용된다.
- 메소드 또는 어노테이션 단위로 붙일 수 있다.
- @Component
- 개발자가 직접 컨트롤이 가능한 클래스들의 경우에 사용된다.
- 클래스 또는 인터페이스 단위에 붙일 수 있다.