2009-09-11 4 views
0

저는 프록시가 아닌 스프링에서 클래스를 가져 오는 것에 관심이 있습니다.스프링에서 프록시 된 인스턴스를 검색하십시오.

예 :

public class FooImpl<KittyKat> { 

    @Transactional 
    public void doStuff() { 
     getBar(); 
     // java.lang.ClassCastException: $Proxy26 cannot be cast to 
     // com.my.foo.Bar 
    } 

} 

public abstract class AbstractFoo<T extends AbstractBar> { 

    public String barBeanName; 

    protected T getBar() { 
     // java.lang.ClassCastException: $Proxy26 cannot be cast to 
     // com.my.foo.Bar 
    return (T)appContext.getBean(barBeanName); 
    } 
} 

public class KittyCat extends AbstractBar { 
... 
} 

public abstract class AbstractBar { 
    ... 
} 
+0

음, 제 예제의 일반성이 사라져서 분명히 편집 할 수 없다는 것을 알지 못합니다. –

+0

거기에 고정되어 있습니다. – skaffman

+0

왜 스프링 구성을 보여 주시겠습니까? barBeanName이 어떻게 생성되는지는 알 수 없습니다. ApplicationContext.getBean()의 사용은 코드에서 나쁜 냄새입니다. 의존성은 주입을 통해 이루어져야합니다. – SteveD

답변

1

당신은 때문에 ClassCastException의 프록시 빈을 얻으려고 노력하고 있습니까? Bar으로 전송할 수 있다면 행복할까요?

Spring은 프록시를 생성 할 때 bean 클래스가 인터페이스를 구현하는지 확인합니다. 그렇다면, 생성 된 프록시도 이러한 인터페이스를 구현하지만 대상 bean의 클래스를 확장하지는 않습니다. 표준 java.lang.reflect.Proxy을 사용하여이 작업을 수행합니다. 이것은 귀하의 예에 해당하는 것 같습니다.

대상 빈 클래스가 인터페이스를 구현하지 않으면 Spring은 CGLIB를 사용하여 대상 빈 클래스의 서브 클래스 인 프록시 클래스를 생성합니다. 이것은 비 인터페이스 빈을 프록시하는 stop-gap 측정 값의 일종입니다.

Spring이 항상 대상 클래스를 프록시하도록 강요 할 수 있지만 그 방법은 먼저 Bar 프록시를 만든 방법에 따라 달라지며 사용자에게 알려주지 않았습니다.

일반적으로 선호되는 솔루션은 프록시로 콩을 인터페이스로 참조하는 것이고 모든 것이 잘 작동합니다. Bar 클래스가 인터페이스를 구현하는 경우 Foo이 해당 인터페이스를 참조하지 않을 수 있습니까?

관련 문제