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 扩展并使其“方法也可访问”。

我不知道你从哪里得到这种印象。默认情况下,所有 Spring AOP 都是在JDK 动态代理上构建的,它仅适用于接口。代理一个具体的类是不可能的。Spring 支持使用 CGLIB 代理来代理类,但参考指南不鼓励使用它,而是支持接口进行编程以减少耦合。

于 2012-12-30T09:33:57.417 回答