복붙노트

[SPRING] Spring의 Proxy 객체를 실제 런타임 클래스로 캐스팅

SPRING

Spring의 Proxy 객체를 실제 런타임 클래스로 캐스팅

Spring을 사용하고 있습니다. 한 시점에서 객체를 실제 런타임 구현으로 캐스팅하려고합니다.

예:

Class MyClass extends NotMyClass {
    InterfaceA a;
    InterfaceA getA() { return a; }

    myMethod(SomeObject o) { ((ImplementationOfA) getA()).methodA(o.getProperty()); }
}

a는 $ ProxyN 객체이므로 ClassCastException을 발생시킵니다. beans.xml에서는 ImplementationOfA 클래스의 bean을 삽입했다.

1 편집 클래스를 확장했고 ImplementationOfA에서 메소드를 호출해야합니다. 그래서 나는 캐스팅해야한다고 생각합니다. 메서드는 매개 변수를받습니다.

EDIT 2

나는 목표 클래스에서 벗어난다.

private T getTargetObject(Object proxy, Class targetClass) throws Exception {
    while( (AopUtils.isJdkDynamicProxy(proxy))) {
        return (T) getTargetObject(((Advised)proxy).getTargetSource().getTarget(), targetClass);
    }
    return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}

나는 그것이 우아하지는 않지만 작동한다는 것을 안다.

모든 크레딧은 http://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/에 있습니다. 고맙습니다!

해결법

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

    1.왜 캐스팅해야합니까? Spring 프록시 사용법에 관해서는 훌륭한 기사이며, 나는 그것을 읽으라고 제안한다.

    왜 캐스팅해야합니까? Spring 프록시 사용법에 관해서는 훌륭한 기사이며, 나는 그것을 읽으라고 제안한다.

    또한 Spring AOP 문서의 프록시 (7.1.3) 절을 참조하십시오.

  2. ==============================

    2.나를 위해 편집 2에서 버전이 작동하지 않았다. 아래에서 하나의 작업 :

    나를 위해 편집 2에서 버전이 작동하지 않았다. 아래에서 하나의 작업 :

    @SuppressWarnings({"unchecked"})
    protected <T> T getTargetObject(Object proxy) throws Exception {
        while( (AopUtils.isJdkDynamicProxy(proxy))) {
            return (T) getTargetObject(((Advised)proxy).getTargetSource().getTarget());
        }
        return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
    }
    

    용법:

        UserServicesImpl serviceImpl = getTargetObject(serviceProxy);
        serviceImpl.setUserDao(userDAO);
    
  3. ==============================

    3.기본적으로 Spring에서 AOP를 사용할 때 Spring은 프록시를 빌드한다. 두 가지 옵션이 있습니다.

    기본적으로 Spring에서 AOP를 사용할 때 Spring은 프록시를 빌드한다. 두 가지 옵션이 있습니다.

    주요 포인트는 여러분의 bean에 aspect가 적용되었다는 것입니다. Spring은 프록시를 인스턴스화 할 것이고 캐스트를 수행하려고 시도하면 예외가 발생할 것입니다.

    이게 당신을 도울 수 있기를 바랍니다.

  4. from https://stackoverflow.com/questions/5976247/casting-a-springs-proxy-object-to-the-actual-runtime-class by cc-by-sa and MIT license