容器+AOP實現動態部署(三)
上節咱們談到容器的基本特性,這次繼續說容器怎樣與AOP進行結合。增強咱們的對象。為對象加入額外的方法。
咱們下面方圖為說明
業務對象通過business 的容器我們能夠註入,而服務類的對象我們通過Service容器將公共類的對象進行註入。關系增強型AOP則通過組合兩者關系進行確定性和不不定性的疊加處理。他們的初始化是通過容器的初始化進行裝載的。
實例代碼
1 初始化對象容器
public class ClassPathXmlApplicationContext { // 業務容器beans private Map<String, Object> businessBeans = new HashMap<String, Object>(); // 公共服務容器beans private Map<String, Object> aspectBeans = new HashMap<String, Object>(); //關系集合配置 private Map<String, Object> relationBeans = new HashMap<String, Object>(); // 設置是否須要aop private boolean isAop = true; /**
有了各個容器對象的支持。就為咱們興許動態調用提供了有力的保障。
增強服務是Aop的特性,請參考博客【動態代理】這裏是通過模擬JDK代理進行實現的。
2 獲取對象,辨別是否增強
2.1基本版本號
簡單的動態調用方式是,在client進行賦值例如以下
public static void main(String[] args) { Greeting greeting = new JDKDynamicProxy(newGreetingImpl()).getProxy();//參數為詳細的類型 greeting.sayHello("Jack"); }
由於咱們業務顆粒都在business容器中,所以咱們能夠通過業務容器提供的方法直接獲取,這樣client就不用知道詳細的類型了。
2.2增強版
/** * 獲取容器中指定對象 * * @param id * 對象名稱如:getBean("user") * @return */ public Object getBean(String id) { return businessBeans.get(id); }
而將對象增強與否是通過咱們的AOP關系進行解析的。所以。以上的方式是不能實現增強的,必須在返回值的時候進行截取,所以在return上動了手腳
2.3加強版
/** * 獲取容器中指定對象 * * @param id * 對象名稱如: getBean("user") * @return */ public Object getBean(String id) { //IsAop標簽進行辨別是否增強 if (!isAop) { return businessBeans.get(id); } //JDK代理類實現動態增強服務 return new JDKDynamicProxy(businessBeans.get(id), aspectBeans, businessBeans,relationBeans) .getProxy(); }
通過getBean方法我們獲取攔截對象。同一時候我們將服務類容器,關系容器一起進行傳入。這樣達到了一個什麽效果呢?請看下圖
在AOP容器中,我們擁有了業務對象,服務對象和關系集合。通過解析關系集合我們動態 Invoke服務的方法在業務方法前後進行增強。
描寫敘述完畢後,咱們再看詳細的實現。
簡單的JDK方法調用還請參考【Java代理】博客。這裏我們對代理類進行了封裝。
3 配置文件
3.1服務類配置XML Service.xml
<!--該文件對是服務類的配置,全部服務類都須要在該文件進行註冊--> <beans> <!--服務類配置容器。配置緩存服務類。全名稱 --> <aspectbean id="aspectCachBean" class="com.tgb.configra.AspectCachBean"></aspectbean> </beans>
3.2關系配置Aop.xml
<!--aop關系配置文件--> <beans> <!--是否啟用aop--> <aop isaop="false"></aop> <!--配置業務顆粒和服務類的增強關系 ,method是攔截業務對象方法,aspectMethod是運行的服務方法--> <aspectbefore aspectId="aspectCachBean" method="save" aspectMethod="cacheSave" ></aspectbefore> </beans>
小結:
到此容器和AOP的結合已經基本成型。我們是通過在獲取容器對象之時對該對象進行了代理,將該對象轉入到AOP容器中,這樣在AOP容器中對該對象進行一系列的增強。
容器事先沒有不論什麽對象。在執行時進行裝配。進行實時存取。帶到動態代理。下篇咱們介紹AOP對象的詳細增強方式。
容器+AOP實現動態部署(三)