Spring Java 구성에서 @Bean 주석이 달린 메소드 호출
스프링 주입이 @Bean
주석으로 메서드 호출을 처리하는 방법에 대해 궁금합니다 . @Bean
메서드에 주석을 달고 인스턴스를 반환하면 스프링이 메서드를 호출하고 반환 된 인스턴스를 가져 와서 빈을 만들도록 지시한다는 것을 이해합니다. 그러나 때로는 해당 빈을 사용하여 다른 빈을 연결하거나 다른 코드를 설정해야합니다. 이 작업을 수행하는 일반적인 방법은 @Bean
주석이있는 메서드를 호출하여 인스턴스를 가져 오는 것입니다. 내 질문은 왜 이것이 빈의 여러 인스턴스가 떠 다니는 원인이되지 않습니까?
예를 들어, 아래 코드를 참조하십시오 (다른 질문에서 발췌). 이 entryPoint()
메서드는 주석으로 처리 @Bean
되었으므로 Spring이의 새 인스턴스를 BasicAuthenticationEntryPoint
빈으로 생성 할 것이라고 생각 합니다. 그런 다음 entryPoint()
configure 블록에서 다시 호출 하지만 entryPoint()
빈 인스턴스를 반환하는 것처럼 보이며 여러 번 호출되지 않습니다 (로깅을 시도했지만 로그 항목이 하나뿐입니다). 잠재적으로 entryPoint()
구성의 다른 부분에서 여러 번 호출 할 수 있으며 항상 동일한 인스턴스를 얻을 수 있습니다. 이것에 대한 나의 이해가 맞습니까? Spring은 주석이 달린 메소드를 마법처럼 재 작성 @Bean
합니까?
@Bean
public BasicAuthenticationEntryPoint entryPoint() {
BasicAuthenticationEntryPoint basicAuthEntryPoint = new BasicAuthenticationEntryPoint();
basicAuthEntryPoint.setRealmName("My Realm");
return basicAuthEntryPoint;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.exceptionHandling()
.authenticationEntryPoint(entryPoint())
.and()
.authorizeUrls()
.anyRequest().authenticated()
.and()
.httpBasic();
}
예, Spring은 약간의 마술을 합니다. Spring Docs 확인 :
이것이 마법이 들어오는 곳입니다. 모든
@Configuration
클래스는 시작시 CGLIB 로 서브 클래 싱됩니다 . 하위 클래스에서 자식 메서드는 부모 메서드를 호출하고 새 인스턴스를 만들기 전에 먼저 컨테이너에서 캐시 된 (범위가 지정된) 빈이 있는지 확인합니다.
이것은 @Bean
메소드에 대한 호출이 CGLIB 를 통해 프록시 되므로 빈의 캐시 된 버전이 리턴 됨을 의미합니다 (새 버전이 작성되지 않음).
@Bean
s 의 기본 범위는입니다 SINGLETON
. 다른 범위를 지정 PROTOTYPE
하면 호출이 원래 메서드로 전달됩니다.
이것은 정적 메서드에는 유효하지 않습니다 . 봄 문서에 따르면 :
기술적 한계로 인해 (이 섹션의 앞부분에서 설명한대로) 클래스
@Bean
내에서도 컨테이너 가 정적 메서드에 대한 호출을 가로 채지 않습니다@Configuration
. CGLIB 하위 클래스는 비 정적 메서드 만 재정의 할 수 있습니다. 결과적으로 다른@Bean
메서드에 대한 직접 호출 은 표준 Java 의미 체계를 가지므로 팩토리 메서드 자체에서 직접 독립 인스턴스가 반환됩니다.
'Programing' 카테고리의 다른 글
Java Final 변수에 기본값이 있습니까? (0) | 2020.10.15 |
---|---|
비동기식, 비차 단식, 이벤트 기반 아키텍처의 차이점은 무엇입니까? (0) | 2020.10.15 |
Visual Studio 15에서 "여기까지 실행"을 비활성화하는 방법은 무엇입니까? (0) | 2020.10.15 |
matplotlib의 imshow를 사용하여 NaN 값을 특수 색상으로 어떻게 플롯 할 수 있습니까? (0) | 2020.10.15 |
IrfanView에서 투명 이미지 배경 설정 (0) | 2020.10.15 |