[SPRING] Spring 빈을 비 프로비저닝 할 수 있습니까?
SPRINGSpring 빈을 비 프로비저닝 할 수 있습니까?
나는 스프링 콩을 가지고있다.
@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.이 시도:
이 시도:
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.Spring 4.2.RC1이 도입됨에 따라,이 경우를 처리하는 전용 유틸리티 클래스가 스프링 테스트 모듈에 추가되었습니다.
Spring 4.2.RC1이 도입됨에 따라,이 경우를 처리하는 전용 유틸리티 클래스가 스프링 테스트 모듈에 추가되었습니다.
이 클래스는 AopTestUtils라고하며 다음과 같은 메소드를 제공합니다.
관련 커밋과 해당 커밋을 확인하십시오.
from https://stackoverflow.com/questions/8121551/is-it-possible-to-unproxy-a-spring-bean by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] java.lang.IllegalStateException : 사용할 수있는 트랜잭션 가능한 EntityManager가 없습니다. (0) | 2018.12.26 |
---|---|
[SPRING] java.lang.NoSuchMethodError : 자바 스크립트 숨겨진 기능은 무엇입니까? (0) | 2018.12.26 |
[SPRING] 파일을 MultiPartFile로 변환 (0) | 2018.12.26 |
[SPRING] java.lang.ClassNotFoundException : org.springframework.web.servlet.DispatcherServlet 오류 (0) | 2018.12.26 |
[SPRING] Spring의 Json은 적절한 응답으로 해결되지 않습니다. (0) | 2018.12.26 |