【Spring实战】—— 11 经过AOP为特定的类引入新的功能

若是有这样一个需求,为一个已知的API添加一个新的功能spring

因为是已知的API,咱们不能修改其类,只能经过外部包装。可是若是经过以前的AOP前置或后置通知,又不太合理,最简单的办法就是实现某个咱们自定义的接口,这个接口包含了想要添加的方法。spa

可是JAVA不是一门动态的语言,没法再编译后动态添加新的功能,这个时候就能够使用 aop:declare-parents 来作了。code

  若是是能够改写的类,直接实现自定义的接口就好了,下面看看AOP是如何作的!blog

  最开始使用的类和接口:接口

package com.spring.test.declareparents; public interface Chinese { public void Say(); }
public class LiLei implements Chinese{ public void Say() { System.out.println("我是中国人!"); } }

  想要添加的新功能和接口ci

package com.spring.test.declareparents; public interface Add { public void Todo(); }
public class DoSomething implements Add{ public void Todo() { System.out.println("我爱中国!"); } }

  经过配置AOP,实现两种功能的耦合get

<bean id="lilei" class="com.spring.test.declareparents.LiLei"/>
    <bean id="doSomething" class="com.spring.test.declareparents.DoSomething"/>
    
    <aop:config proxy-target-class="true">
        <aop:aspect>
            <aop:declare-parents types-matching="com.spring.test.declareparents.LiLei" implement-interface="com.spring.test.declareparents.Add" 
            default-impl="com.spring.test.declareparents.DoSomething"/>
        </aop:aspect>
    </aop:config>
</beans>

  其中types-mathcing是以前原始的类,implement-interface是想要添加的功能的接口,default-impl是新功能的默认的实现。编译

  在使用时,直接经过getBean得到bean转换成相应的接口就能够使用了。class

Chinese lilei = (Chinese)ctx.getBean("lilei"); lilei.Say(); Add lilei2 = (Add)ctx.getBean("lilei"); lilei2.Todo();
相关文章
相关标签/搜索