2013-10-24 4 views
4

나는 Spring Integration을 사용하여 대기열을 수신 대기하는 클래스 JobListener을 가지고있다. 안에 JobListener, 나는 Autowired 필드 Helper "프로토 타입"으로 정의 된 범위가 있습니다. 도우미의 범위가 Protype로 정의되어 있기 때문에 autowired가있는 스프링 프로토 타입 범위

public class JobListener { 

@Autowired 
private Helper helper; 

@ServiceActivator 
public void receiveMessage(Message<String> message){ 
    helper.processMassage(message); 
    } 
} 

이제 내 질문에, 나는 도우미의 새로운 인스턴스마다 recieveMessage가 호출을받을 것입니까?

+0

빠른 응답, 아니요, 스프링 프레임 워크로 JobListener를 만들면 클래스 생성시 헬퍼를 자동으로 실행하지만 도우미에 대한 참조가있는 다른 클래스는 다른 인스턴스 – RamonBoza

+1

을 수신합니다. receiveMessage'helper = (Helper) context.getBean ("helper"); ' – RamonBoza

답변

7

컨테이너는 단 하나의 빈인 JobListener 만 생성하므로 속성을 설정할 기회가 하나뿐납니다. 컨테이너가 필요할 때마다 bean JobListener에 bean Helper의 새 인스턴스를 제공 할 수 없습니다.

Method Injection : Lookup method injection은 컨테이너가 컨테이너 관리 Bean의 메소드를 대체하여 컨테이너의 다른 명명 된 Bean에 대한 검색 결과를 리턴하는 기능입니다.

public abstract class JobListener { 

@ServiceActivator 
public void receiveMessage(Message<String> message){ 
    Helper helper = createHelper(); 
    helper.processMassage(message); 
    } 

protected abstract Helper createHelper(); 
} 

스프링 프레임 워크는 Helper의 새로운 인스턴스 그것을가 요청 될 때마다 시간을 제공하기 위해 createHelper 메소드를 오버라이드 (override) 할 JobListener의 동적 서브 클래스를 생성합니다 :이 솔루션을 구현하기 위해이 같은 JobListener 클래스를 재 - 정의 . 당신이

Helper helper = createHelper(); 

을 실행 그것은 당신에게 새로운을 반환 장소에 위의 구성으로

<bean id="helper" class="x.y.Helper" scope="prototype"> 
... 
</bean> 

<bean id="jobListener" class="x.y.JobListener"> 
<lookup-method name="createHelper" bean="helper"/> 
</bean> 

, 모든 시간 :

당신은 JobListener 빈 정의에 lookup-method 이름의 이름을 정의해야 Helper의 인스턴스입니다.

+0

모두에게 감사드립니다. 신속한 답장으로 많은 시간과 재 작업을 절약 할 수있었습니다. – Ayushi

+0

@Ayushi 오신 것을 환영합니다. –