容器+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 ...
随机推荐
- hadoop一主一从部署(1)
一.安装前说明 主机IP:192.168.132.128 从机IP:192.168.132.129 1. 所有的安装包我放在了/root/这个目录下,你要根据自己情况去修改,这点必须注意 2. 采用的 ...
- Linux egrep命令
Linux egrep命令用于在文件内查找指定的字符串. egrep执行效果与"grep-E"相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法. e ...
- [转]自适应网页设计(Responsive Web Design)
本文转自:http://www.ruanyifeng.com/blog/2012/05/responsive_web_design.html 作者: 阮一峰 日期: 2012年5月 1日 随着3G的普 ...
- 6.11---@RequestMapping注解的6+2个属性---6.11
produces:它的作用是指定返回值类型,不但可以设置返回值类型还可以设定返回值的字符编码: consumes: 指定处理请求的提交内容类型(Content-Type),例如application/ ...
- 【java基础】java中重载与重写的区别
重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性的一种表现. ( ...
- html中保证中文能够正常显示
<meta http-equiv="Content-Type" content="text/html"; charset=utf-8"/> ...
- servlet-响应信息
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.ser ...
- mysql自动增长的有关问题,怎么恢复从1开始
mysql自动增长的问题,如何恢复从1开始在一个表中我设置到autoid为自动增长列例如有如下数据 1 张三 男 202 王五 男 223 李四 男 254 陈大 男 19 现在我把 autoid=3 ...
- MSSQL高并发下生成连续不重复的订单号
一.确定需求 只要做过开发的基本上都有做过订单,只要做过订单的基本上都要涉及生成订单号,可能项目订单号生成规则都不一样,但是大多数规则都是连续增长. 所以假如给你一个这样的需求,在高并发下,以天为单位 ...
- python 获取本机环境信息
一.函数 1.socket.gethostname():不带任何参数,返回一个字符串(主机名),通常不完整.比如csm.example.com 只会返回csm 2.socket.getfqdn():带 ...