【Spring實戰】—— 11 通過AOP為特定的類引入新的功能


如果有這樣一個需求,為一個已知的API添加一個新的功能

由於是已知的API,我們不能修改其類,只能通過外部包裝。但是如果通過之前的AOP前置或后置通知,又不太合理,最簡單的辦法就是實現某個我們自定義的接口,這個接口包含了想要添加的方法。

但是JAVA不是一門動態的語言,無法再編譯后動態添加新的功能,這個時候就可以使用 aop:declare-parents 來做了。

  如果是可以改寫的類,直接實現自定義的接口就行了,下面看看AOP是如何做的!

  最開始使用的類和接口:

package com.spring.test.declareparents;

public interface Chinese {
    public void Say();
}
public class LiLei implements Chinese{
    public void Say() {
        System.out.println("我是中國人!");
    }
}

  想要添加的新功能和接口

package com.spring.test.declareparents;

public interface Add {
    public void Todo();
}
public class DoSomething implements Add{
    public void Todo() {
        System.out.println("我愛中國!");
    }
}

  通過配置AOP,實現兩種功能的耦合

    <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轉換成相應的接口就可以使用了。

        Chinese lilei = (Chinese)ctx.getBean("lilei");
        lilei.Say();
        
        Add lilei2 = (Add)ctx.getBean("lilei");
        lilei2.Todo();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM