복붙노트

[SPRING] 스프링 자바 설정에서 @Bean 어노테이션으로 된 메소드 호출하기

SPRING

스프링 자바 설정에서 @Bean 어노테이션으로 된 메소드 호출하기

Spring injection이 @Bean 어노테이션으로 메소드를 호출하는 방법에 대해 궁금합니다. 메소드에 @Bean 어노테이션을 넣고 인스턴스를 반환하면 메소드를 호출하고 반환 된 인스턴스를 가져와 Bean을 생성하도록 Spring에 알린다는 것을 이해합니다. 그러나 때로는 다른 bean을 연결하거나 다른 코드를 설정하는 데 bean을 사용해야합니다. 이것이 행해지는 통상적 인 방법은 인스턴스를 얻기 위해 @Bean annotated 메소드를 호출하는 것입니다. 내 질문은, 왜 주위에 떠 다니는 콩의 여러 인스턴스가 발생하지 않는가?

예를 들어, 아래의 코드 (다른 질문에서 가져옴)를 참조하십시오. entryPoint () 메소드는 @Bean으로 주석 처리되어 있으므로 스프링이 BasicAuthenticationEntryPoint의 새 인스턴스를 bean으로 생성 할 것이라고 생각합니다. 그런 다음 configure 블록에서 entryPoint ()를 다시 호출하지만 entryPoint ()가 Bean 인스턴스를 반환하고 여러 번 호출되지 않은 것처럼 보입니다 (로깅을 시도하고 하나의 로그 항목 만 가져옴). 잠재적으로 구성의 다른 부분에서 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();       
}

해결법

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

    1.예, 봄은 마술을합니다. Spring 문서 확인 :

    예, 봄은 마술을합니다. Spring 문서 확인 :

    이것은 @Bean 메쏘드에 대한 호출이 CGLIB를 통해 프록시되기 때문에 캐쉬 된 빈 버전이 리턴된다는 것을 의미합니다 (새로운 것이 생성되지 않습니다).

    @Beans의 기본 범위는 SINGLETON입니다. PROTOTYPE과 같이 다른 범위를 지정하면 호출이 원래 메소드로 전달됩니다.

    정적 메소드에는 유효하지 않습니다. 봄 워드 프로세서에 따라 :

  2. from https://stackoverflow.com/questions/27990060/calling-a-bean-annotated-method-in-spring-java-configuration by cc-by-sa and MIT license