Post

SpringBootApplication

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@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 {

  @AliasFor(annotation = EnableAutoConfiguration.class)
  Class<?>[] exclude() default {};

  @AliasFor(annotation = EnableAutoConfiguration.class)
  String[] excludeName() default {};

  @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
  String[] scanBasePackages() default {};
  
  @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
  Class<?>[] scanBasePackageClasses() default {};

  @AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")
  Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
  
  @AliasFor(annotation = Configuration.class)
  boolean proxyBeanMethods() default true;

}


메타 애노테이션

1
2
3
4
5
6
7
8
@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)})
애노테이션설명
@Target타입에만 붙일 수 있는 애노테이션이다
@Retention런타임 동안에는 계속 참조 가능하다
@Inherited자식 클래스에게 애노테이션이 상속되도록 한다
@SpringBootConfiguration환경 설정 빈 구성을 자동으로 찾을 수 있게 해준다
@EnableAutoConfiguration@CompnentScan으로 빈이 등록된 이후, 추가적인 빈들을 읽어 등록하는 애노테이션
@ComponentScan스프링 빈으로 등록될 것임을 알려준다
@Filter스프링 빈으로 등록할 것과 등록하지 않을 것을 구분해준다


메소드

  • exclude : 특정 클래스를 자동 설정에서 제외함
  • excludeName : 클래스의 이름으로 자동 설정에서 제외함
  • scanBasePackages : 컴포넌트 스캔(빈 탐색)을 진행할 베이스 패키지 설정
  • scanBaseClasses : 컴포넌트 스캔을 진행할 베이스 클래스를 설정
  • nameGenerator : 빈 이름 생성을 담당할 클래스를 설정함
  • proxyBeanMethods : @Bean 메소드를 프록시 방식으로 처리하도록 설정한다

proxyBeanMethods

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Configuration(proxyBeanMethods = false)
public class Config {

  @Bean
  public SampleBean sampleBean() {
    return new SampleBean();
  }

  @Bean
  public BeanA beanA() {
    return new BeanA(sampleBean());
  }

  @Bean
  public BeanB beanB() {
    return new BeanB(sampleBean());
  }
}

위의 코드로 빈을 생성하면 원래는 하나만 생성되어야 하는 SampleBean이 두 개가 만들어진다. 그 이유는 proxyBeanMethods = false로 설정되었기 때문이다. 이는 Config 클래스에 프록시가 적용되지 않았기 때문이다. 하지만 이 상황은 보통 개발자들이 원하는 상황이 아니기 때문에 스프링은 기본값으로 proxyBeanMethods = true를 기본값으로 가지고 있으며 바이트 조작 라이브러리인 CGLib을 통해 프록시 패턴을 적용한다. 그렇게 해당 @Bean 메소드가 호풀되어 이미 빈이 생성되었으면 존재하는 빈을 찾아서 반환하여 싱글톤을 유지하도록 하는 것이다.

This post is licensed under CC BY 4.0 by the author.