上篇咱们介绍了容器和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. 720P、1080P、4K是什么意思?

    什么是像素? 中文全称为图像元素.像素仅仅只是分辨率的尺寸单位,而不是画质. 从定义上来看,像素是指基本原色素及其灰度的基本编码. 像素是构成数码影像的基本单元,通常以像素每英寸PPI(pixels ...

  2. dfs序题目练习

    参考博文:http://blog.csdn.net/qwe2434127/article/details/49819975 http://blog.csdn.net/qq_24489717/artic ...

  3. Jmeter-----图形监控

    1.下载插件地址:https://jmeter-plugins.org/downloads/old/ 1)JmeterPlugins-Standard 插件:将JMeterPlugins.jar放到J ...

  4. 495. Teemo Attacking

    In LOL world, there is a hero called Teemo and his attacking can make his enemy Ashe be in poisoned ...

  5. 使用minikube在windows构建kubernetes群集

    只建议在开发环境中使用,不建议在windows下使用docker或者kubernetes. 1. 安装VirtualBox或者Hyper-v(安装步骤略) 2. 下载kubectl和minikube工 ...

  6. 移动App 的 ios11 和 iPhoneX 适配

    原文链接:https://blog.csdn.net/lovelyelfpop/article/details/79460700 WKWebView 调用拨打电话功能 1.HTML 要标记添加标记电话 ...

  7. 【转载】Xutils3源码解析

    Github源码地址:https://github.com/wyouflf/xUtils3 原文地址 :http://www.codekk.com/blogs/detail/54cfab086c476 ...

  8. javascript的优缺点和内置对象

    1)优点:简单易用,与Java有类似的语法,可以使用任何文本编辑工具编写,只需要浏览器就可执行程序,并且事先不用编译,逐行执行,无需进行严格的变量声明,而且内置大量现成对象,编写少量程序可以完成目标: ...

  9. python 什么是全局解释器锁GIL

    什么是全局解释器锁GIL Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在 ...

  10. Selenium快速入门(下)

    Frame相关 import time from selenium import webdriver from selenium.common.exceptions import NoSuchElem ...