【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();
相關文章
相關標籤/搜索