容器+AOP实现动态部署(三)
来源:互联网 发布:glsl 数组 编辑:程序博客网 时间:2024/06/11 11:11
上节咱们谈到容器的基本特性,这次继续说容器如何与AOP进行结合,增强咱们的对象。为对象添加额外的方法。
咱们以下方图为说明
业务对象通过business的容器我们可以注入,而服务类的对象我们通过Service容器将公共类的对象进行注入,关系增强型AOP则通过组合两者关系进行确定性和不不定性的叠加处理。他们的初始化是通过容器的初始化进行装载的。
实例代码
1 初始化对象容器
public class ClassPathXmlApplicationContext {// 业务容器beansprivate Map<String, Object> businessBeans = new HashMap<String, Object>();// 公共服务容器beansprivate Map<String, Object> aspectBeans = new HashMap<String, Object>();//关系集合配置private Map<String, Object> relationBeans = new HashMap<String, Object>();// 设置是否需要aopprivate 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实现动态部署(三)
- 容器+AOP 实现动态部署(一)
- 容器+AOP 实现动态部署(二)
- 容器+AOP实现动态部署(四)
- Java动态代理三--模拟AOP实现
- Spring旅程(三) AOP--Spring AOP容器基础
- AOP系列之三:用Java动态代理实现AOP
- Spring 容器AOP的实现原理——动态代理
- Spring 容器AOP的实现原理——动态代理
- Spring 容器AOP的实现原理——动态代理
- 菜鸟学SSH(十四)——Spring容器AOP的实现原理——动态代理
- Java动态代理三——模拟AOP实现
- Java动态代理三——模拟AOP实现
- 自己实现Spring AOP(三)CGLib代理实现AOP
- 利用JAVA的动态属性之反射原理实现一个简单AOP容器 - AOP的实现原理分析
- 自己实现IoC,AOP容器
- Spring实现AOP动态代理(1)
- Spring:AOP(三)XML方式实现AOP
- Leveldb/lmdb/comdb 各种存储引擎的个人见解
- 【编程题】01串排序
- 虚拟机NAT模式下上网
- JavaScript创建对象的几种方式
- Java基础——基本概念
- 容器+AOP实现动态部署(三)
- 欢迎使用CSDN-markdown编辑器
- Number of Islands (leetcode)
- hihocoder题库1000
- 思维改变生活之记忆
- poj 3352 Road Construction (无向图edge-BCC缩点)
- Linux图形界面与字符界面切换
- 黑马程序员-OC语言-ios第一天笔记总结
- linux常用命令的英文单词缩写