복붙노트

[SPRING] 콩에 대한 Spring @Configuration 캐시 참조는 어떻게 되는가?

SPRING

콩에 대한 Spring @Configuration 캐시 참조는 어떻게 되는가?

Spring은 Java 기반 구성을 사용할 때 bar ()에 대한 두 번째 호출을 어떻게 방지합니까?

컴파일 시간 주석 처리 또는 메서드를 proxying하여 궁금하네요?

@Configuration
public class AppConfig {

  @Bean
  public Foo foo() {
      return new Foo(bar());
  }

  @Bean
  public Foo foo2() {
      return new Foo(bar());
  }

  @Bean
  public Bar bar() {
      return new Bar();
  }
}  

해결법

  1. ==============================

    1.당신이 당신의 문맥을 약간의 무언가 같이 창조했다고 가정하십시오.

    당신이 당신의 문맥을 약간의 무언가 같이 창조했다고 가정하십시오.

    AnnotationConfigApplicationContext context =
        new AnnotationConfigApplicationContext(AppConfig.class);
    

    @Configuration으로 인해, Spring은 AppConfig 타입의 빈을 생성하고 @Bean 메소드를 가지고 있기 때문에 그것을 프록시 처리한다. 구현 세부 사항은 ConfigurationClassEnhancer를 확인해야합니다.

    이러한 메서드는 개체에서 직접 호출되지 않습니다. 분명히 그들은 컴파일 시간에 알려지지 않았기 때문에 그렇게 할 수 없습니다. 그들은 프록시에 반영을 통해 호출됩니다.

    그래서 네가 가질 때

    @Bean
    public CustomBean foo() {
        return new CustomBean(bar());
    }
    

    이는

    @Bean
    public CustomBean foo() {
        return new CustomBean(this.bar());
    }
    

    이것은 메소드 호출의 결과를 캐시하고 이전에 호출 된 경우 즉시 리턴하는 프록시를 나타냅니다.

  2. ==============================

    2.Spring은 bar ()에 대한 호출을 "방지"하지 않습니다. 대신, 시작할 때 spring은 @Bean으로 표시된 메소드 목록을 생성하고 각 메소드를 한 번 호출합니다. 원하는 경우 bar ()를 100 번 호출 할 수 있습니다. 봄, 그러나; 한 번만 호출 할 것입니다.

    Spring은 bar ()에 대한 호출을 "방지"하지 않습니다. 대신, 시작할 때 spring은 @Bean으로 표시된 메소드 목록을 생성하고 각 메소드를 한 번 호출합니다. 원하는 경우 bar ()를 100 번 호출 할 수 있습니다. 봄, 그러나; 한 번만 호출 할 것입니다.

  3. from https://stackoverflow.com/questions/20615374/how-does-spring-configuration-cache-references-to-beans by cc-by-sa and MIT license