溫故知新:spring_04靜態(tài)代理實現(xiàn)AOP

          spring的另一個重要特性是AOP(Aspect Oriented Programming)面向切面的編程,spring的AOP特性使得對于使用了該特性的項目的可維護性,易拓展性和開發(fā)難易度等等都有了不同程度的改善。AOP特性能夠使得項目中的某些操作,在執(zhí)行到某一個指定環(huán)節(jié)的時候,可以額外的去執(zhí)行開發(fā)者指定的操作,這些操作往往都是具有共通性,而且可能和操作本身所包含的業(yè)務邏輯沒有直接的關系,比如對數(shù)據(jù)庫的訪問,涉及變更數(shù)據(jù)庫內(nèi)容的操作需要精準的記錄日志;每當產(chǎn)生異常或者錯誤信息的時候,也需要記錄錯誤信息;對服務器敏感資源進行訪問的時候需要對用戶的權限進行校驗等。在哪些環(huán)節(jié)添加處理,做怎樣的處理,都可以由開發(fā)者自定義,十分靈活,而且在開發(fā)業(yè)務邏輯和流程的時候大可不必去考慮這些共同性質(zhì)的處理,讓主要精力都投入在業(yè)務的實現(xiàn)上,這樣一來,開發(fā)效率會大大提高。

          先從一個靜態(tài)代理的例子來感受一下這種切入式的編程
          IUserDao
          1 package org.duyt.dao;
          2 public interface IUserDao {
          3     public void add();
          4 }
          UserDao
           1 package org.duyt.dao.impl;
           2 
           3 import org.duyt.dao.IUserDao;
           4 import org.springframework.context.annotation.Scope;
           5 import org.springframework.stereotype.Repository;
           6 
           7 @Repository("userDao")
           8 @Scope("singleton")
           9 public class UserDao implements IUserDao {
          10     public void add() {
          11         System.out.println("用戶增加方法");
          12     }
          13 }
          14 
          一個很單純的接口實現(xiàn)。倘若這就是一個成品了,測試通過沒有問題,可以上線使用。一段時間之后,需要加入日志的功能,那么問題來了,挖掘機哪...噢不對,該如何添加呢?
          或許會馬上想到,直接該啊。那么問題又來了,挖...噢不,直接修改的話,代碼就需要測試,而且萬一需要修改的地方很多呢,豈不是很痛苦,況且直接修改源代碼還違背了OCP原則,絕對不推薦。這時候就可以考慮使用代理類來給源代碼增加新功能。
          代理,望文生義,白話就是“你要做的事兒我不僅能給你做了,而且除此之外我還能多做別的”,定義一個UserProxyDao
           1 package org.duyt.dao.impl;
           2 
           3 import javax.annotation.Resource;
           4 
           5 import org.duyt.dao.IUserDao;
           6 import org.duyt.util.Logger;
           7 import org.springframework.context.annotation.Scope;
           8 import org.springframework.stereotype.Repository;
           9 
          10 @Repository("userProxyDao")
          11 @Scope("singleton")
          12 public class UserProxyDao implements IUserDao {
          13 
          14     @Resource
          15     private IUserDao userDao;
          16     
          17     public void add() {
          18         Logger.info("使用代理,為用戶增加方法添加日志");
          19         userDao.add();
          20 
          21     }
          22 
          23 }
          24 
          在代理中,將需要拓展功能的對象作為代理的屬性注入,然后在需要拓展的方法前后追加需要的功能。在此之后,在給service的IuserDao對象注入實例的時候,要使用代理的對象@Resource(name = "userProxyDao"),測試一下
           1 package org.duyt.test;
           2 
           3 import org.duyt.action.UserAction;
           4 import org.junit.Test;
           5 import org.springframework.beans.factory.BeanFactory;
           6 import org.springframework.context.support.ClassPathXmlApplicationContext;
           7 
           8 public class IocTest {
           9 
          10     private BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
          11     
          12     @Test
          13     public void test(){
          14         //測試代理依賴注入
          15         UserAction ua = (UserAction) factory.getBean("userAction");
          16         ua.addUser();
          17     }
          18     
          19 }
          20 
          結果:
          使用代理,為用戶增加方法添加日志
          用戶增加方法

          由于IOC和AOP的特性,你會發(fā)現(xiàn)你要做的更改十分的少,僅僅只是新增了一個代理類,并修改了注入的對象。雖然靜態(tài)的代理可以實現(xiàn)我們的需求,但是畢竟不靈活,一旦修改涉及的方法和類一多,那簡直就是純體力活了,一個類的拓展就需要對應一個代理類,一個代理類中還需要涵蓋所有需要拓展的方法,并且保證原有功能不受影響,如此一來,功能拓展這一舉動就需要投入極大的成本,入不敷出。

          posted on 2014-11-04 14:57 都較瘦 閱讀(155) 評論(0)  編輯  收藏 所屬分類: containerFramework

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統(tǒng)計

          公告

          博客定位:囿于目前的水平,博客定位在記錄自己的學習心得和隨手的練習

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 永平县| 德钦县| 望谟县| 承德市| 泾川县| 永新县| 庆阳市| 平遥县| 襄城县| 永顺县| 同心县| 特克斯县| 图们市| 嘉祥县| 津市市| 北流市| 长乐市| 侯马市| 伊宁市| 平泉县| 敦煌市| 舒城县| 甘德县| 丁青县| 东乌珠穆沁旗| 武夷山市| 兴和县| 安福县| 正宁县| 五寨县| 昌邑市| 辽源市| 民县| 泽库县| 大安市| 栖霞市| 蓬莱市| 云梦县| 濮阳县| 弥渡县| 沙坪坝区|