복붙노트

[SPRING] @Configuration이 있고 클래스가없는 클래스 내부의 @Bean

SPRING

@Configuration이 있고 클래스가없는 클래스 내부의 @Bean

Spring 3.0에는 @Bean 어노테이션이있다. Java 코드에서 Spring 빈을 직접 정의 할 수 있습니다. Spring 레퍼런스를 탐색하는 동안이 주석을 사용하는 두 가지 다른 방법, 즉 @Configuration으로 주석 처리 된 클래스와이 주석이없는 내부 클래스를 찾았습니다.

이 섹션에는 다음 코드 조각이 포함되어 있습니다.

@Component
public class FactoryMethodComponent {

   @Bean @Qualifier("public")
   public TestBean publicInstance() {
      return new TestBean("publicInstance");
   }

   // omitted irrelevant method
}

그리고 여기서는 매우 비슷한 코드 조각을 볼 수 있습니다. 그러나 이제는 @Configuration이 있습니다 :

@Configuration
public class AppConfig {
   @Bean
   public MyService myService() {
      return new MyServiceImpl();
   }
}

이전 섹션에는 다음 설명이 포함되어 있습니다.

Spring 구성 요소의 @Bean 메소드는 Spring @Configuration 클래스 내부의 대응 메소드와 다르게 처리됩니다. 차이점은 @Component 클래스가 메소드 및 필드의 호출을 가로 채기 위해 CGLIB로 향상되지 않는다는 것입니다. CGLIB 프록시는 @Configuration 클래스의 메소드 나 필드를 호출하여 @Bean 메소드가 공동 작업 객체에 대한 빈 메타 데이터 참조를 작성하는 수단입니다. Java의 일반적인 시멘틱스에서는, 메소드가 불려 가지 않습니다. 반대로, @Component 클래스 @Bean 메소드 내에서 메소드 또는 필드를 호출하는 것은 표준 자바 의미론을 가지고있다.

그러나 CGLIB는 응용 프로그램 개발자가 알지 못하는 일종의 내부적 인 물건입니다 (이상적인 세계에서). 두 경우 모두 Spring Bean을 생성하기 위해 @Bean으로 주석 처리 된 Spring 호출 메소드를 알고 있으므로 두 경우 모두 이러한 인스턴스가 공동 작업자에게 주입됩니다.

그래서 내 질문은이 두 경우 사이의 응용 프로그램 개발자로서 나와 다른 점은 무엇입니까?

해결법

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

    1.차이점은 @Configuration을 사용하면 다음과 같이 다른 인스턴스에서 @Bean 메서드를 호출하고 완전히 초기화 된 인스턴스를 얻을 수 있다는 것입니다.

    차이점은 @Configuration을 사용하면 다음과 같이 다른 인스턴스에서 @Bean 메서드를 호출하고 완전히 초기화 된 인스턴스를 얻을 수 있다는 것입니다.

    public class Foo {
        @Value("Hello, world!")
        public String value;
    }
    
    @Configuration
    public class Config {
        @Bean
        public Foo createFoo() {
            Foo foo = new Foo();
            System.out.println(foo.value); // Prints null - foo not initialized yet
            return foo;
        }
    
        @Bean
        public Bar createBar() {
            Foo foo = createFoo();
            System.out.println(foo.value); // Prints Hello, world! - foo have been initialized by the interceptor
            return new Bar(foo);
        }
    }
    
  2. ==============================

    2.@Bean 인스턴스의 @Bean [인스턴스 메소드] - @Bean 인스턴스를 가진 하나의 메소드는 다른 메소드를 호출합니다. @Bean 인스턴스는 간단한 자바 의미 호출입니다. 즉, Spring 컨테이너가 객체를 반환하지 않습니다. java 인스턴스 팩토리에서 정상 반환됩니다. 왜냐하면 Component 클래스는 CGLIB를 확장하지 않기 때문입니다.

    @Bean 인스턴스의 @Bean [인스턴스 메소드] - @Bean 인스턴스를 가진 하나의 메소드는 다른 메소드를 호출합니다. @Bean 인스턴스는 간단한 자바 의미 호출입니다. 즉, Spring 컨테이너가 객체를 반환하지 않습니다. java 인스턴스 팩토리에서 정상 반환됩니다. 왜냐하면 Component 클래스는 CGLIB를 확장하지 않기 때문입니다.

    @Configuration 내부의 @Bean [인스턴스 메소드] -이 경우 스프링 컨테이너는 기존 객체에 대한 참조를 반환합니다. 정상적인 Java sematic call은 아니다.

    Configuration & Component Class 내부의 정적 메소드에 대한 @Bean -이 경우 @Bean 메소드는 Configuration 클래스 나 Component Sterotype 클래스에서 컨테이너로 절대로 가로 챌 수 없습니다.

  3. from https://stackoverflow.com/questions/3330618/bean-inside-class-with-configuration-and-witout-it by cc-by-sa and MIT license