복붙노트

[SPRING] Spring 빈을 비 프로비저닝 할 수 있습니까?

SPRING

Spring 빈을 비 프로비저닝 할 수 있습니까?

나는 스프링 콩을 가지고있다.

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class AImpl implements A {

     public void setSomeDependency(D dependency) {
         // This setter DOES NOT BELONG to interface A
     }
}

<bean id="aImpl" class="AImpl"/>

이제 통합 테스트를하고 싶지만 우선 너무 의존적이기 때문에 의존성 D를 조롱해야합니다. AImpl은 인터페이스를 구현하고 트랜잭션 주석을 포함하고 있으므로 생성 된 프록시는 인터페이스 A 와만 호환되므로 다음과 같이 할 수 있습니다.

@Inject @Named("aImpl")
private A a;

그러나 할 수 없다 :

@Inject @Named("aImpl")
private AImpl a;

결과적으로 나는 내 의존성을 조롱 할 수 없다.

인터페이스 A에 void setSomeDependency (D 의존성)를 추가하는 것은 비즈니스 적 의미가 없으므로 선택 사항이 아니라는 점에 유의하십시오. proxy-target-class = "true"를 사용하지 않습니다.이 빈은 다른 많은 빈들 (이 애트리뷰트는 컨텍스트의 모든 빈에 영향을 미칩니다)을 손상시킵니다.

주입 된 bean A를 unproxy 할 수있는 방법이 있나요? 그래서 그것을 AImpl에 캐스트 할 수 있습니까?

해결법

  1. ==============================

    1.이 시도:

    이 시도:

    if(AopUtils.isAopProxy(a) && a instanceof Advised) {
        Object target = ((Advised)a).getTargetSource().getTarget();
        AImpl ai = (AImpl)target;
    }
    

    보너스 : 스칼라에서 나는 같은 목적으로 다음과 같은 기능을 사용하고 있습니다 :

    def unwrapProxy(a: AnyRef) = a match {
        case advised: Advised if(AopUtils.isAopProxy(advised)) => 
                                advised.getTargetSource.getTarget
        case notProxy => notProxy
    }
    
  2. ==============================

    2.Spring 4.2.RC1이 도입됨에 따라,이 경우를 처리하는 전용 유틸리티 클래스가 스프링 테스트 모듈에 추가되었습니다.

    Spring 4.2.RC1이 도입됨에 따라,이 경우를 처리하는 전용 유틸리티 클래스가 스프링 테스트 모듈에 추가되었습니다.

    이 클래스는 AopTestUtils라고하며 다음과 같은 메소드를 제공합니다.

    관련 커밋과 해당 커밋을 확인하십시오.

  3. from https://stackoverflow.com/questions/8121551/is-it-possible-to-unproxy-a-spring-bean by cc-by-sa and MIT license