4

@Inject 인 의존성을 어떻게 지연 시키는가?주입 된 bean 의존성을 지연 초기화 (Spring 3)

public class ClassA { 
    @Inject 
    ClassB classB; 
} 


@Configuration 
public class Config { 
    @Bean 
    public ClassA classA() { 
     return new ClassA(); 
    } 

    @Bean 
    @Lazy 
    public ClassB classB() { 
     return new ClassB(); 
    } 
} 

classA bean이 인스턴스화 될 때 classB bean도 @Lazy annotation에도 불구하고 인스턴스화됩니다. 클래스 B 빈 인스턴스화를 피하려면 어떻게해야합니까?

+1

필요할 때까지는 게으르다. Spring은'ClassA'에 주입하기 위해 그것을 인스턴스화해야하므로, 그 시점에서 초기화됩니다. –

답변

0

정말 그렇게 할 수는 없습니다. Sotirios가 말한 것처럼, Spring은 ClassA에 그것을 삽입하기 위해 그것을 인스턴스화해야한다. 응용 프로그램 컨텍스트를 사용하여 수동으로 수행 할 수 있습니다. 다음과 같이하십시오.

public class ClassA { 

    @Inject 
    private ApplicationContext appContext; 

    private ClassB classB; 

    //Bean will be instanciated when this method is called 
    public ClassB getClassB() { 
     if (classB == null) { 
      classB = appContext.getBean(ClassB.class); 
     } 
     return classB; 
    } 
} 

그런 다음 getter를 사용하여 개체에 액세스하십시오.

+1

그래서 lazy init은 '@Inject'또는 '@Autowired'가 아닌 속성에만 해당됩니까? 이는 내가 아는 한, 이러한 주석은 항상 새로운 버전의 Spring에서 사용되기 때문에 약간 제한적으로 보인다. bean이 xml 파일에 설정되어 있다면, lazy가 작동 할까? – Ana

+0

게으른 초기화, 빈 범위 및 삽입이 어떻게 작동하는지 이해하지 못한다고 생각합니다. Lazy init은 '@Inject'또는 '@Autowired'와 함께 사용하기위한 것이지만, 싱글 톤 스코프가있는 빈에 게으른 빈을 삽입하는 것은 실제로 의미가 없습니다. 빈을 XML에 넣으면 똑같은 일을 할 것이다. 결국, Lazy = true 인 Singleton 빈은 Prototype 빈처럼 인스턴스화된다. 차이점은 빈이 인스턴스화 될 때 항상 동일한 인스턴스를 리턴한다는 점이다. –

+0

답변 해 주셔서 대단히 감사합니다. 사실, 나는 게으른 초기화와 빈 범위 사이의 관계를 이해하지 못한다. 그래서 싱글 톤에서는 게으르다. 스프링이 시작할 때 콩의 인스턴스를 만들 것이기 ​​때문이다. 프로토 타입 빈은 시작시 초기화되지 않지만 기본적으로이 사실이 아닙니까? @Lazy는 어디에서 차이를 만드나요? 프로토 타입 빈이 초기화 될 때조차도 프로토 타입 빈의 지연 의존성은 초기화되지 않지만 싱글 톤 빈의 지연 의존성은 항상 초기화된다. – Ana