programing

Spring Java 설정에서 @Bean 주석이 달린 메서드를 호출합니다.

copysource 2022. 9. 25. 14:55
반응형

Spring Java 설정에서 @Bean 주석이 달린 메서드를 호출합니다.

스프링 인젝션이 어떻게 콜 메서드를 처리하는지 궁금하네요.@Bean주석입니다.를 붙이면@Bean메서드에 대한 주석과 인스턴스를 반환하면 메서드를 호출하고 반환된 인스턴스를 가져와 빈을 생성하도록 스프링에 지시하는 것으로 알고 있습니다.그러나 때로는 그 콩을 다른 콩과 연결하거나 다른 코드를 설정하기 위해 사용해야 합니다.이 작업을 수행하는 일반적인 방법은@Beaninstance를 가져오기 위한 주석 메서드.제 질문은, 왜 이것이 여러 개의 콩이 떠다니게 하지 않느냐는 것입니다.

예를 들어, (다른 질문에서 가져온) 아래 코드를 참조하십시오.entryPoint()방법에 주석을 달다@Bean그래서 나는 봄이 새로운 예를 만들어 낼 것이라고 상상한다.BasicAuthenticationEntryPoint콩으로요.그럼 전화하겠습니다.entryPoint()다시 설정 블록에 포함되지만entryPoint()는 빈 인스턴스를 반환하고 여러 번 호출되지 않습니다(로그를 시도했지만 로그 엔트리는 1개뿐).전화할 수도 있습니다.entryPoint()이 경우 항상 동일한 인스턴스가 생성됩니다.제가 이해한 것이 맞습니까?봄은 어떤 마법 같은 방법으로 주석을 달았나요?@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();       
}

네, 봄은 마법을 부려요.스프링 문서를 확인합니다.

여기서 마법이 찾아온다: All@Configuration클래스는 시작 시 CGLIB를 사용하여 서브클래스가 됩니다.서브클래스에서 자녀 메서드는 부모 메서드를 호출하여 새 인스턴스를 작성하기 전에 먼저 컨테이너에 캐시된(범위 지정) 콩이 있는지 확인합니다.

이것은, 에의 콜이@Bean메서드는 CGLIB를 통해 프록시되므로 캐시된 버전의 빈이 반환됩니다(새로운 버전은 생성되지 않습니다).

디폴트 범위@Beans는SINGLETON다음과 같은 다른 범위를 지정하는 경우PROTOTYPE콜이 원래의 메서드로 전달됩니다.

정적 메서드에는 사용할 수 없습니다.스프링 문서에 따르면:

스태틱 콜@Bean메서드는 컨테이너에 의해 가로채이지 않으며, 심지어 내부에서도 가로채지 않습니다.@Configurationclasses(이 섹션의 앞부분에서 설명한 바와 같이)는 기술적인 제한으로 인해 CGLIB 서브클래싱은 비정적 메서드만 덮어쓸 수 있습니다.그 결과, 다른 사람에게 직접 전화를 걸 수 있습니다.@Beanmethod는 표준 Java 시멘틱스를 가지므로 공장 메서드 자체에서 직접 독립 인스턴스가 반환됩니다.

언급URL : https://stackoverflow.com/questions/27990060/calling-a-bean-annotated-method-in-spring-java-configuration

반응형