2016-09-20 13 views
0

私はSpringのプロキシメカニズムを理解しようとしています。 私が持っているインタフェース:Spring AOPプロキシとインターフェイスの実装

public interface MyInterface{ 
    void myMethod(); 
} 

および実装するクラス:

@Component 
public class MyBean implements MyInterface{ 
    @Override 
    public void myMethod(){ 
    //do something 
    } 
} 

は、今私は、たとえば、アスペクトを作成します。

@Aspect 
@Component 
public class LogAspect { 
    @Before("execution(public * *(..))") 
    public void logBefore() { 
     System.out.println("Before aspect"); 
    } 
} 

そして、私はシンプルなスタータークラスがあります。

@Configuration 
@ComponentScan 
@EnableAspectJAutoProxy 
public class SpringAopApplication { 
    public static void main(String[] args) { 
     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
       SpringAopApplication.class); 

     MyBean bean = ctx.getBean(MyBean.class); 
//  MyInterface bean = ctx.getBean(MyInterface.class); //works 
     bean.myMethod(); 

     ctx.close(); 
    } 
} 

A私たちが読むことができる春のドキュメントへのccording:

ターゲットオブジェクトがプロキシする場合は実装少なくとも一つのインターフェース その後、JDKの動的プロキシが使用されます。ターゲットタイプによって実装されたすべてのインターフェイス がプロキシされます。ターゲットオブジェクト がインタフェースを実装していない場合は、CGLIBプロキシが作成されます。

しかし、私はエラーが定義されている[MyBeanと]タイプのない予選豆を得ました。これはCGLibプロキシを@EnableAspectJAutoProxy(proxyTargetClass = true)で有効にした場合にのみ機能します。 誰かが私がここで何が不足しているか説明できますか? AOPを使用しているときにMyBeanが検出されないのはなぜですか? ctx.getBean(MyInterface.class)が動作しますが、私はそのようなインターフェイスの多くの実装で状況を想像することはできません。

答えて

2

プロキシ対象のオブジェクト(MyBean)は少なくとも1つのインタフェース(MyInterface)を実装しているため、JDKプロキシが使用されます。 このプロキシはMyInterfaceを実装しますが、MyBeanのインスタンスではありません。 ザッツなぜ

MyInterface bean = ctx.getBean(MyInterface.class); 

作品と

MyBean bean = ctx.getBean(MyBean.class); 

ません。

CGLibプロキシはターゲットオブジェクトをサブクラス化することによって作成されるため、作成されたBeanはMyBeanのサブクラスであり、MyInterfaceを実装します。 この場合も

MyBean bean = ctx.getBean(MyBean.class); 

作品です。

...しかし、私はそのようなインターフェイスの多くの実装で状況を想像することはできません。

MyInterfaceの唯一の理由は、春にJDKプロキシを作成できるようにするためです。多くの実装を行う必要はありません。

関連する問題