在Spring AOP简介中丢失了原始界面

时间:2012-12-30 09:22:37

标签: java spring spring-aop

这是我的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版)中描绘的图片。 Can the caller access both the interfaces 'Existing method' and 'Introduced method'?

1 个答案:

答案 0 :(得分:4)

  

从'简介'的定义我理解代理那个   实现新接口将从OriginalClass扩展并制作   它的'方法也可以访问。

我不确定你的印象是从哪里来的。默认情况下,所有Spring AOP都在JDK dynamic proxies上构建,仅适用于接口。代理一个具体的课是不可能的。在Spring中,支持使用CGLIB代理来代替类,但是它的使用是discouraged by the reference guide,有利于对接口进行编程以减少耦合。