若是有這樣一個需求,爲一個已知的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();