容器+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 ...
随机推荐
- Codeforces 825D 二分贪心
题意:给一个 s 串和 t 串, s 串中有若干问号,问如何填充问号使得 s 串中字母可以组成最多的 t 串.输出填充后的 s 串. 思路:想了下感觉直接怼有点麻烦,要分情况:先处理已经可以组成 t ...
- ACM_新七步诗(深搜)
新七步诗 Time Limit: 2000/1000ms (Java/Others) Problem Description: 突然的一天,小锴做了一个梦,梦见自己来到了三国,而自己也成了梦寐以求的帅 ...
- Docker学习系列(一):windows下安装docker(转载)
本文目录如下: windows按照docker的基本要求 具体安装步骤 开始使用 安装远程连接工具连接docker 安装中遇到的问题 Docker的更新 Docker中的jupyter windows ...
- InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
InnoDB锁机制之Gap Lock.Next-Key Lock.Record Lock解析 有意思,解释的很好
- JS——鼠标在盒子中的坐标
核心思想: 1.复杂版本:鼠标pageX.pageY的值减去盒子距离顶端的offsetLeft.offsetTop值就是鼠标在盒子中的坐标 2.简单版本:offsetX.offsetY就可获取鼠标相对 ...
- view.getParent()与view.getRootView()
顾名思义,getParent就是获取view的父亲节点,而getRootView是寻找当前的view层次中处在最顶层的view,可理解为找出该view实例所在的view层次的根view. 如果这个vi ...
- Build Tool-自动化构建工具
输入:工程文件+编译说明文件: 处理:自动化构建工具+编译器: 输出:可执行文件. 相对于手动编译. Historically, build automation was accomplished t ...
- CAD类型转换
AcDbEntity *pEnt; AcDbCircle *pcir = AcDbCircle::cast(pEnt); static_cast<AcDbCircle*>(pEnt); p ...
- 一个ROS的服务,使机器人向前移动指定距离
源代码有点长,放文末链接里了. 服务描述及代码现在的服务是:请求时携带要前进的距离,然后底盘前进相应距离.代码如下,改动很小: #!/usr/bin/env python import rospyfr ...
- Linux如何查看端口(转)
Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000 # lsof -i:8000 COMMAND PID USER ...