码迷,mamicode.com
首页 > 其他好文 > 详细

容器+AOP实现动态部署(三)

时间:2015-06-27 21:31:44      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:容器

  上节咱们谈到容器的基本特性,这次继续说容器如何与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基本版本

简单的动态调用方式是,在客户端进行赋值如下 

  public static void main(String[] args) {
        Greeting greeting = new JDKDynamicProxy(newGreetingImpl()).getProxy();//参数为具体的类型
        greeting.sayHello("Jack");
    }

因为咱们业务颗粒都在business容器中,所以咱们可以通过业务容器提供的方法直接获取,这样客户端就不用知道具体的类型了。


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实现动态部署(三)

标签:容器

原文地址:http://blog.csdn.net/han_yankun2009/article/details/46663531

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!