다른 빈 (B)이 필요한 빈 (A라고 부름)이있는 경우가 있습니다.런타임에서 간접적으로 빈 인스턴스 얻기
이 B는 MethodInvokingFactoryBean을 사용하는 클래스의 정적 메서드에서 검색됩니다. 이 정적 메서드는 시스템 상태에 따라 다르며 웹 응용 프로그램이로드 된 후에 작동합니다.
런타임시에만 B에 액세스해야합니다 (생성자에서 상호 작용 없음). A를 구성하여 bean B를 autowire하고 A가 처음 요구할 때만 초기화 할 수 있습니까?
응용 프로그램 컨텍스트에서만 getBean을 사용하고 있습니까?
감사합니다!
* 편집 - 추가 된 일부 XMLS : *
이 빈 B의 정의는이
<bean id="api" class="com.foo.API"/>
<bean id="B" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="true">
<property name="targetObject" ref="api"/>
<property name="targetMethod" value="getFactory"/>
<qualifier value="myQualifer"/>
</bean>
이 빈 A의 정의입니다
<bean id="resources.someRESTResourceA" class="com.foo.MyRestResource"/>
Autowire를 사용하여 B를 A에 연결할 수 없습니다. A의 구성에서 B를 초기화하므로 사용할 수 없습니다.
B의 targetMethod는 웹 응용 프로그램을 초기화 한 후에 만 작동합니다. 은 내가 내부 ApplicationContext.getBean ("B")를 사용할 수 있지만 우아한 아니에요 그리고 내가 (도 요구되지 않는) 다음을 수행하지 않는 한 단위 테스트에 문제가있을 것입니다 :
public BInterface getB() {
if (b == null) {
b = ApplicationContext.getBean("B");
}
return b;
}
예제 빈 코드와 함께 Spring 컨텍스트의 예제를 게시 할 수 있다면 질문을 이해하는 것이 훨씬 쉽다. –
몇 가지 코드와 xmls를 추가했습니다. 감사합니다. – TheGuyWhoCodes
안녕하세요, 저는 이것에 대해서도 고심하고있었습니다. 결국 나는 내 문제에 대한 해결책을 찾았다. 스프링의 ApplicationContextAware 인터페이스를 구현하면 스프링에 의해 호출되는 setApplicationContext 메소드를 구현해야한다. Spring은 컨텍스트의 인스턴스에 넣는다. 일단 가지고 있으면 appContext.getBean()을 사용하여 원하는 bean을 간단히 가져올 수 있습니다. Voila. 단순한. – Lawrence