私は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)
が動作しますが、私はそのようなインターフェイスの多くの実装で状況を想像することはできません。