복붙노트

[SPRING] Spring에서 @ComponentScan으로 모든 bean을 느리게로드하는 방법?

SPRING

Spring에서 @ComponentScan으로 모든 bean을 느리게로드하는 방법?

Java 기반 설정을 사용하여 Spring 애플리케이션 컨텍스트를 다음과 같이 설정한다.

@Configuration
@Lazy
@ComponentScan(basePackageClasses = {MyProject.class, OtherProject.class})
public class MyAppConfig {
    ...
}

구성에서 명시 적으로 정의 된 빈은 예상 한 것처럼 느리게로드됩니다. 그러나 @Named로 주석 된 스캔 된 클래스는 항상 열심히로드됩니다. 어떻게 해결할 수 있습니까?

어떤 도움을 주셔서 감사합니다.

MyProject 패키지의 클래스의 경우 @Lazy로 주석을 달아서이 문제를 해결할 수 있습니다. 하지만 다른 프로젝트는 Spring에 대한 의존성이 없기 때문에 그렇게 유지하고 싶습니다 (따라서 @Component가 아닌 @Named).

또한 XML 기반 구성에서이 점이 문제가되지는 않습니다. 거기서, 태그 솔기에서 default-lazy-init = "true"로 설정하면 원하는 것을 할 수 있습니다 (테스트하지는 않았지만).

해결법

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

    1.버전 4.1 RC2에서이 버그가 수정되었으며 다음을 사용하여 구성 요소 검사에서 지연로드를 수행 할 수 있습니다.

    버전 4.1 RC2에서이 버그가 수정되었으며 다음을 사용하여 구성 요소 검사에서 지연로드를 수행 할 수 있습니다.

    @ComponentScan(basePackages = ["..."], lazyInit = true)
    

    https://jira.spring.io/browse/SPR-10459

  2. ==============================

    2.앞에서 말한 것처럼 직접 처리 할 방법은 없습니다 (구성 클래스에서 @Lazy 사용). 하지만이 방법으로 시도해 볼 수 있습니다.

    앞에서 말한 것처럼 직접 처리 할 방법은 없습니다 (구성 클래스에서 @Lazy 사용). 하지만이 방법으로 시도해 볼 수 있습니다.

    OtherProject는 Spring을 사용하지 않는 프로젝트이며,이 클래스에 주석이 없다고 가정합니다.

    그런 다음 Myproject에서 다음과 같은 구성을 정의해야합니다.

    @Configuration
    // Avoid use this line if classes aren't annotated @ComponentScan("com.otherProject")
    public class MyProjectConfig {
    
        @Bean(name = "lazyBean")
        @Lazy
        public LazyBean lazyBean(){
            System.out.println("Loading LazyBean bean");
            return new LazyBean(); // Or use a static method factory, this is only an example
        }
    }
    

    이것을 사용하면 bean "lazyBean"은 어떤 인스턴스가 인스턴스를 삽입 할 때 또는 명시 적으로 호출 할 때 생성되지만 초기화시에는 생성되지 않습니다.

    사용하려는 클래스마다 새 빈을 정의해야하므로 클래스 수가 많지만 다른 프로젝트의 클래스에 대한 액세스 가능성을 최소화하는 것이 좋지는 않습니다 (모든 클래스가 필요하지는 않음) .

    이게 도움이 되길 바란다.

  3. from https://stackoverflow.com/questions/12207057/how-to-load-all-beans-lazily-with-componentscan-in-spring by cc-by-sa and MIT license