4

これが私のSpring AOP構成です。

<bean id="myObject" class="com.madzone.learn.spring.aop.OriginalClass"></bean>
<bean id="aspect" class="com.madzone.learn.spring.aop.AspectClass"></bean>
<aop:config>
    <aop:aspect ref="aspect">
        <aop:declare-parents
            types-matching="com.madzone.learn.spring.aop.OriginalClass+"
            implement-interface="com.madzone.learn.spring.aop.IntroducedInterface"
            default-impl="com.madzone.learn.spring.aop.IntroducedInterfaceImpl" />
    </aop:aspect>

ApplicationContext context = new ClassPathXmlApplicationContext("myApp.xml");
Object myObject = context.getBean("myObject");
if (myObject instanceof OriginalClass) {
    System.out.println("This is OriginalClass");
}
if(myObject instanceof IntroducedInterface) {
    System.out.println("This is IntroducedInterface");
}

この導入により、IntroducedInterfaceのメソッドを呼び出すことができました。しかし、OriginalClass のメソッドにアクセスできませんでした。上記のコード スニペットでは、「This is OriginalClass」が出力されませんでした。

「はじめに」の定義から、新しいインターフェイスを実装するプロキシは OriginalClass から拡張され、そのメソッドにもアクセスできるようになることがわかりました。

ここで何か不足していますか?もしあれば、誰かが理由を説明できますか?

PS: 以下は、Spring in Action (第 3 版) の写真です。 呼び出し元は、「既存のメソッド」と「導入されたメソッド」の両方のインターフェイスにアクセスできますか?

4

1 に答える 1

6

「はじめに」の定義から、新しいインターフェイスを実装するプロキシがOriginalClassから拡張され、そのメソッドにもアクセスできるようになることがわかりました。

どこからその印象を受けたのかわかりません。すべてのSpringAOPは、デフォルトで、インターフェースに対してのみ機能するJDK動的プロキシー上に構築されています。具体的なクラスをプロキシすることは不可能です。Springでは、代わりにクラスをプロキシするためにCGLIBプロキシを使用することサポートされていますが、カップリングを減らすためのインターフェイスへのプログラミングを優先して、リファレンスガイドではその使用を推奨していません。

于 2012-12-30T09:33:57.417 に答える