2010-11-24 2 views
4

다른 빈 (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; 
} 
+1

예제 빈 코드와 함께 Spring 컨텍스트의 예제를 게시 할 수 있다면 질문을 이해하는 것이 훨씬 쉽다. –

+0

몇 가지 코드와 xmls를 추가했습니다. 감사합니다. – TheGuyWhoCodes

+0

안녕하세요, 저는 이것에 대해서도 고심하고있었습니다. 결국 나는 내 문제에 대한 해결책을 찾았다. 스프링의 ApplicationContextAware 인터페이스를 구현하면 스프링에 의해 호출되는 setApplicationContext 메소드를 구현해야한다. Spring은 컨텍스트의 인스턴스에 넣는다. 일단 가지고 있으면 appContext.getBean()을 사용하여 원하는 bean을 간단히 가져올 수 있습니다. Voila. 단순한. – Lawrence

답변

1

당신이해야 게으르게 당신은 여전히 ​​당신이 getBean() 방법으로 그것을 필요로 할 때 Spring 컨테이너에서 빈 A를 검색해야

<bean id="A" class="demo.A" lazy-init="true"> 
    <property name="b" ref="B"/> 
</bean> 

콩 A.

를 초기화합니다. ApplicationContextAware 인터페이스로 쉽게 접근 할 수 있습니다.

Bean A를 다른 bean에 autowire하고 해당 Bean을 Bean B가 생성되기 전에 검색하면 Spring 컨테이너는 다른 Bean에 등록 정보로 주입 될 때 Bean A를 작성합니다.

+0

Bean A는 웹 응용 프로그램을 시작할 때 만들어지는 REST 서비스이기 때문에 lazy init이 될 수 없습니다. – TheGuyWhoCodes

관련 문제