2009-10-14 4 views
4

주어진 다음의 클래스 :누락 된 종속성의 프록시를 자동으로 만들고 주입하는 방법?

package com.acme; 

public class Foo { 
    private Bar bar; 
    public void setBar(Bar newBar) { 
    this.bar = newBar; 
    } 
} 

@AcmeService 
public interface Bar {} 

과의 Spring 설정 파일 :

<beans> 
    <bean id="foo" class="com.acme.Foo"> 
    <property name="bar" ref="bar" /> 
    </bean> 
</beans> 

봄의 구성 단계 실행이 가능하다는 다음과 같은 작업을 수행하는 경우?

  1. 캐치 누락 된 종속 예외 (또는있을 것입니다 감지) 콩 "foo는"누락 된 의존성 "바"형 com.acme.Bar
  2. 공지의 것을
  3. 발견 그 막대기는 @AcmeService이고, 그래서 우리는 그것을 처리 할 것입니다. 그렇지 않으면 오류가 치명적일 수 있습니다.
  4. com.acme.Bar 형식의 프록시 생성
  5. 바 프록시를 Foo에 주입하여 명시 적으로 작성한 것처럼 Bar의 메소드 호출에 Spring AOP를 알릴 수 있습니다. Spring 설정 파일의 Bar 프록시와 Foo 빈에 프록시를 삽입한다.

나는 처음에 설명서를 읽으면 내가 원하는 것을 정확하게 수행의 확실한 방법이 표시되지 않았지만,이를 구현하기위한 수단으로 에 BeanPostProcessorBeanFactoryPostProcessor를 그려졌다.

당신이 궁금해하는 경우

, 기본 유스 케이스는 내가 원하는 것입니다에 :

  • 는 @의 프록시를 생성하는 하나의 컨텍스트 파일 내 서비스 레이어 빈 정의 모든 Spring 컨텍스트 파일을 교체 AcmeService 빈 인터페이스.
  • 대신 서비스 계층 Bean 프록시의 인터페이스 조롱 (mock)에서 이러한 프록시에 대한 호출을 호출하도록 권고합니다. (키커는 원격 시스템에 의해 런타임에 모의 객체가 정의되고 통합 테스트 목적으로이 애플리케이션에 업로드된다는 것입니다. 정기적 인 단위 테스트에서는 필요에 따라 모의 객체를 만들고 주입하는 것이 더 정숙합니다.

나는 "동적으로 생성하는 프록시"비트를 제외한 모든 기능을 가지고 있습니다. 현재는 컨텍스트 파일에 정의 된 서비스 인터페이스의 빈 구현만으로 주입 및 권고를받을 수 있습니다. 그러나 빈 인터페이스 클래스가 생성되어 체크인되지는 않을 것입니다. 그리고 마지막으로 이들을 생성해야한다고 가정합니다. null 종속성에 대한 호출 시도를 조언하는 방법을 모르기 때문에 프록시.

답변

2

좋아요, 여기에 몇 가지 이야기 할 항목이 있습니다.

첫째, 나는 네가 요구하는 것을 정확히 할 수 없을 것이라고 생각한다. 특히 <property name="bar" ref="bar"/>이 있고 bar에 대한 bean 정의가 없으면 bean 초기화가 실패하고 쉽게 가로 챌 수 있다고 생각하지 않습니다. 물론 BeanFactory 자체 하위 클래스를 작성할 수도 있지만 가볍게 처리 할 수있는 것은 아닙니다.

가장 가까운 기존 메커니즘은 자동 배선입니다.AutowiredAnnotationBeanPostProcessor을 살펴보십시오. 이것을 컨테이너로 인스턴스화 할 때 모든 bean을보고, @AcmeService 주석을 갖는 유형의 속성을 찾고 자신의 BeanPostProcessor을 작성하기위한 지침으로 사용할 수 있습니다. 하나를 찾으면 해당 유형의 프록시를 생성하고 삽입 할 수 있습니다.

그러면 프록시 생성 자체가 발생합니다. 찾는 곳은 ProxyFactory입니다. 이렇게하면 advisor/interceptor를 연결하는 동안 인터페이스를 구현하거나 클래스를 확장하는 런타임에 객체를 생성 할 수 있습니다. 이러한 인터셉터는 모든 작업을 수행 할 수 있습니다. 프록시는 사용자가 원하지 않는 경우 "뒤에서"아무 것도 가질 필요가 없습니다.

이 방법을 사용하면 구성에 "hanging"<property name="bar" ref="bar"/> 항목이 필요하지 않습니다. Foo에 속성이 있으면이 프로세스를 트리거하기에 충분합니다.

+1

도움 주셔서 감사합니다. 언뜻보기에 AutowiredAnnotationBeanPostProcessor를 서브 클래스 화하고 findAutowireCandidates의 사용자 정의 구현을 제공하면 필자가 원하는만큼 근접 할 수 있습니다. 결실을 증명하면 더 조사하고 답을 수락합니다! –

+1

내가 원했던 것은 실제로 가능하지 않았지만, 다행스럽게도 내 문제에 대한 다른 접근 방식이 어쨌든이를 수행 할 필요성을 없앴습니다. –

관련 문제