上篇咱们介绍了容器和AOP的结合,结合后怎样将对象增强服务并没有过多的说明,这里将详细说明怎样将对象
进行增强 ,达到一个一对多和多对多的增强方式

先从简单的方式说起

/**
*JDK代理类,实现动态调用对象方法
*/
public class JDKDynamicProxy
implements InvocationHandler { /**
*……省略方法
*/ /**
*回调使用方法,运行选择的方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target, args);
after();
return result;
} private void before() { System.out.println("Before");
} private void after() {
System.out.println("After");
} }

以上代码转为图形为

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFuX3lhbmt1bjIwMDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

我们将详细的颗粒固定在
了AOP中。这样一来,若再想添加服务颗粒可得修改代码,这不是一种非常好的解决方案。为了更好更好的将服务与AOP解耦,我们将服务咱们装载到了一个服务容器中。

这样就有了先前的版本号

基本是我们须要的。通过截取业务颗粒。将服务颗粒,关系集合一起传递到AOP中,AOP进行解析。若是有多个服务颗粒呢,于是我们有了变更版本号

将右側的服务颗粒放在了一个容器中,多个服务颗粒同一时候为一个业务对象服务。

若有多个服务颗粒,想要这写服务同一时候为全部业务颗粒提供支持,就成了例如以下图了

1 首先通过构造函数将所须要的參数传递进来

	private Map<String, Object> aspectBeans; // 服务容器
private Map<String, Object> businessBeans;// 业务容器
private Map<String, Object> relationBeans;// 关系容器 /***
*
* @param target
* 被代理对象
* @param aspectBeans
* 切容器
* @param businessBeans
* 业务容器
* @param relationBeans
* 关系集合
*/
public JDKDynamicProxy(Object target, Map<String, Object> aspectBeans,
Map<String, Object> businessBeans, Map<String, Object> relationBeans) {
this.target = target;
this.aspectBeans = aspectBeans;
this.businessBeans = businessBeans;
this.relationBeans = relationBeans; }

2  在回调函数中
调用解析关系xml方法。进行方法调用

	// 回调注冊切入对象方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { List beforeList = (List) relationBeans.get("aspectbefore");// 获取关系容器中的关系
invokeAspectName(beforeList, method, args);// 调用切面类中匹配方法
Object result = method.invoke(target, args);// 调用 被代理类本身方法 return result;
} /**
*
* @Title: getAllMethod
* @Description: 运行某个服务类中的全部方法,
* @param @param clazz 服务类
* @param @param aspectClass aop关系集合中设定运行 拦截的方法
* @param @param args 被拦截对象的參数
* @return void 返回类型
* @throws
*/
public void getAllMethod(Class clazz, String aspectClass, Object[] args)
throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException, NoSuchMethodException, SecurityException { // 获取服务类中的全部公共方法
Method[] methods = clazz.getDeclaredMethods();
for (int j = 0; j < methods.length; j++) { // 反射获取服务类中每一个方法名称,获取该服务类方法
Method jinectmethod = clazz.getMethod(methods[j].getName(), Object.class);
// 反射调用服务类中方法
jinectmethod.invoke(aspectBeans.get(aspectClass),
args == null ? new Object[1] : args); }
}

小结:

以上就是对AOP关系的基本解释,一步步逐渐演变,也不是一蹴而就的。所以回到学习上,也不是一次学习就能够全然的,要不断重复的思考和总结。详细的源代码点击连接

容器+AOP实现动态部署(四)的更多相关文章

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

    上节咱们谈到容器的基本特性,这次继续说容器怎样与AOP进行结合.增强咱们的对象.为对象加入额外的方法. 咱们下面方图为说明 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...

  2. Android动态部署五:怎样从插件apk中启动Service

    转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/Dy ...

  3. AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署

    一.前言 (Jenkins.Docker.Git/Svn组建一套简单的自动化发布流程) 文章中用到的相关服务器角色 角色 环境 功能 开发机 Win10.Docker(Linux OS) 编码.调试 ...

  4. iOS应用动态部署方案

    iOS的动态部署能极大的节约成本.苹果的审核周期很长,有的时候,你可能不得不等待将近2个星期去上架你的新功能或者bug.所以动态部署是有价值的. 我这里讨论的情况不把纯web应用考虑在内,因为用户体验 ...

  5. iOS应用架构谈 本地持久化方案及动态部署

    转载: iOS应用架构谈 本地持久化方案及动态部署 前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给 ...

  6. idea web项目动态部署

    最近通过idea新创建一个web项目,想让web项目的前后端代码都动态部署.虽然网络上已经有了不少文章,但我自己还是有遇到一些坑,因此总结一下我遇到的坑的经验. 项目的web容器用的是本地的tomca ...

  7. docker kubernetes Swarm容器编排k8s CICD部署

    1docker版本 docker 17.09 https://docs.docker.com/ appledeAir:~ apple$ docker version Client: Docker En ...

  8. ssiOS应用架构谈 本地持久化方案及动态部署

    本文转载至 http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...

  9. iOS应用架构谈part4-本地持久化方案及动态部署

    前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者PR或者评论区.每一个issue和 ...

随机推荐

  1. git的一些配置

    git使用socks代理加速 原来git可以配置socks代理的,真好,从github上clone了opencv的代码,基本上是满速了. 首先需要配置shadowsocks,然后通过GUI客户端(或命 ...

  2. SQL Server 数据库优化剖析

    一.SQL Profiler 事件类 Stored Procedures\RPC:Completed TSQL\SQL:BatchCompleted 事件关键字段 EventSequence.Even ...

  3. 诺基亚9 PureView正式发布

    [手机中国新闻]当地时间2月24日下午16点,HMD在西班牙巴塞罗那正式发布了诸多新品,其中最吸睛的莫过于Nokia 9 PureView.作为全球首款五摄新机,Nokia 9 PureView后置五 ...

  4. oracle创建计划任务

    特别提示: oracle是执行完任务,才按照interval去计算下次执行时间!!! 为精确每个5分钟执行一个任务,必须自己计算时间. 如:trunc_minute(sysdate)+/ create ...

  5. 最大公约数or最小公倍数

    最大公约数or最小公倍数 import org.junit.Test; public class 最大公约数or最小公倍数 { public int maxGYS(int m,int n) { int ...

  6. Ubuntu 18.04 更改静态IP

    2018年4月26日,ubuntu 18.04发行,第一时间下载安装了SERVER版本.使用VM14版本的虚拟机,开始使用DHCP获得IP地址,没有意外,可以直接上网.然而在更改VM的网络模式为桥接模 ...

  7. 洛谷P3434 [POI2006]KRA-The Disks [模拟]

    题目传送门 KRA 题目描述 For his birthday present little Johnny has received from his parents a new plaything ...

  8. Python并发编程-进程池及异步方式

    进程池的基本概念 为什么有进程池的概念 效率问题 每次开启进程,都需要开启属于这个进程的内存空间 寄存器,堆栈 进程过多,操作系统的调度 进程池 python中的 先创建一个属于进程的池子 这个池子指 ...

  9. 【伪暴力+智商剪枝】Codeforces Round #489 (Div. 2) D

    失踪人口突然回归……orz.题解还是有必要写的,虽然估计只有自己(?自己也不一定看得懂)看得懂. 题目链接:http://codeforces.com/contest/992/problem/D 题目 ...

  10. 【BZOJ 3456】 3456: 城市规划 (NTT+多项式求逆)

    3456: 城市规划 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 658  Solved: 364 Description 刚刚解决完电力网络的问题 ...