[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.차이점은 @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.@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 클래스에서 컨테이너로 절대로 가로 챌 수 없습니다.
from https://stackoverflow.com/questions/3330618/bean-inside-class-with-configuration-and-witout-it by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 주석이 달린 매개 변수로 Spring AOP advice에 인수를 전달하려면 어떻게해야합니까? (0) | 2019.04.24 |
---|---|
[SPRING] NoSuchBeanDefinitionException SessionFactory 빈을 초기화하는 방법? (0) | 2019.04.24 |
[SPRING] 종속성 문제 "SpringBootServletInitializer를 유형으로 확인할 수 없음" (0) | 2019.04.24 |
[SPRING] postgresql 쿼리에 대한 큰 ResultSet (0) | 2019.04.24 |
[SPRING] JSP 페이지에서 hasPermission을 사용할 수 있도록 스프링 보안을 설정하는 방법은 무엇입니까? (0) | 2019.04.24 |