容器+AOP实现动态部署(三)
上节咱们谈到容器的基本特性,这次继续说容器怎样与AOP进行结合。增强咱们的对象。为对象加入额外的方法。
咱们下面方图为说明
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFuX3lhbmt1bjIwMDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
业务对象通过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实现动态部署(三)的更多相关文章
- 容器+AOP实现动态部署(四)
上篇咱们介绍了容器和AOP的结合,结合后怎样将对象增强服务并没有过多的说明,这里将详细说明怎样将对象 进行增强 ,达到一个一对多和多对多的增强方式 先从简单的方式说起 /** *JDK代理类,实现动态 ...
- Android动态部署五:怎样从插件apk中启动Service
转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/Dy ...
- AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
一.前言 上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来. 如果该应用继续引入mysql.redis.job等若干服务,到时候发布一次得工作量之大 ...
- iOS应用架构谈 本地持久化方案及动态部署
转载: iOS应用架构谈 本地持久化方案及动态部署 前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给 ...
- ssiOS应用架构谈 本地持久化方案及动态部署
本文转载至 http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...
- iOS应用架构谈part4-本地持久化方案及动态部署
前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者PR或者评论区.每一个issue和 ...
- 5.2 spring5源码--spring AOP源码分析三---切面源码分析
一. AOP切面源码分析 源码分析分为三部分 1. 解析切面 2. 创建动态代理 3. 调用 源码的入口 源码分析的入口, 从注解开始: 组件的入口是一个注解, 比如启用AOP的注解@EnableAs ...
- iOS应用动态部署方案
iOS的动态部署能极大的节约成本.苹果的审核周期很长,有的时候,你可能不得不等待将近2个星期去上架你的新功能或者bug.所以动态部署是有价值的. 我这里讨论的情况不把纯web应用考虑在内,因为用户体验 ...
- idea web项目动态部署
最近通过idea新创建一个web项目,想让web项目的前后端代码都动态部署.虽然网络上已经有了不少文章,但我自己还是有遇到一些坑,因此总结一下我遇到的坑的经验. 项目的web容器用的是本地的tomca ...
随机推荐
- group by 和 select
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面.
- Set-----集合入门
函数中的集合和 数学中的集合 基本上差不多 集合中每个元素最多只能出现一次 并且 当元素储存到set集合之中 会自动 按照 ascll 进行 从小到大的 排序 大神关于 set 的 详 ...
- MVC系列学习(八)-分布视图
1.本次学习实例 1.1.建议:为了尽可能让项目简单,就新建一个空的mvc项目,同时添加任何视图不用模板页 1.2注意:在添加LoginPart的分部视图时,要记得沟一个沟 2.项目代码,如下 总共三 ...
- MySQL关于存储过程
代码示例: 1.IN输入参数: delimiter // create PROCEDURE proc1(IN sid int) begin select * from student where id ...
- UDP网络程序实例
根据前面所讲的网络编程的基础知识,以及UDP网络编程的特点,下面创建一个广播数据报程序.广播数据报是一种较新的技术,类似于电台广播,广播电台需要在指定的波段和频率上广播信息,收听者也要将收音机调到指定 ...
- 影响ERP成功实施的因素及实施方法
一.影响ERP实施的因素 1.企业自身管理和认识上的问题.在ERP实施过程中没有用变革管理的理念和方法来策划和管理ERP的实施是导致ERP失败的主要原因. ERP作为一种管理工具他的实施本身就是操作手 ...
- echarts交叉关系图二
echarts关系图表,此图是坐标关系图,此图用的随机坐标,此图可以拖拽,更方便整理关系, 引入echarts.js就可以实现 代码: var graph={ //这是数据项目中一般都是获取到的 no ...
- (转) Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)
http://blog.csdn.net/u010648555/article/details/60767633 当任何时候觉你得难受了,其实你的大脑是在进化,当任何时候你觉得轻松,其实都在使用以前的 ...
- TCP:三次握手,URG、ACK、PSH、RST、SYN、FIN 含义
http://blog.csdn.net/wudiyi815/article/details/8505726 TCP:SYN ACK FIN RST PSH URG简析 三次握手Three-way ...
- 在Python中利用CVXOPT求解二次规划问题
工作中需要用到cvxopt,cvxopt安装有坑,大家注意下.1.首先一定要卸载numpy,无论是直接安装的,还是anaconda安装的,主要是必须用whl安装numpy才不会有包的冲突2.二次规划包 ...