1. 程式人生 > >容器+AOP實現動態部署(三)

容器+AOP實現動態部署(三)

集合 tar details class 處理 tid ret con sta

上節咱們談到容器的基本特性,這次繼續說容器怎樣與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實現動態部署(三)