上篇咱们介绍了容器和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");  }  }

以上代码转为图形为

我们将详细的颗粒固定在 了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方法。进行方法调用

    // 回调注冊切入对象方法@Overridepublic 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关系的基本解释,一步步逐渐演变,也不是一蹴而就的。所以回到学习上,也不是一次学习就能够全然的,要不断重复的思考和总结。详细的源代码点击连接

转载于:https://www.cnblogs.com/blfshiye/p/5383295.html

容器+AOP实现动态部署(四)相关推荐

  1. Spring 容器AOP的实现原理——动态代理

    本文来自极客学院 Spring 容器AOP的实现原理--动态代理 之前写了一篇关于IOC的博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大 ...

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

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

  3. 阿里云容器服务体验: 部署 ShellPays 条码支付整合服务平台 -- (四)结案陈词

    上回提要 阿里云容器服务体验: 部署 ShellPays 条码支付整合服务平台 -- (一)系统概要与环境准备 阿里云容器服务体验: 部署 ShellPays 条码支付整合服务平台 -- (二)实操 ...

  4. Openstack rocky 部署四: neutron 部署与验证(控制节点)

    Openstack 云计算(二): Openstack Rocky部署四 neutron 部署与验证 (控制节点) 标签(空格分隔): openstack系列 一:Neutron概述 二:Neutro ...

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

    原文链接:http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...

  6. Docker容器整合wagon-ssh自动化部署SpringBoot工程

    一.前提条件:  机器上已经安装了docker(安装过程) 准备部署的springboot的jar包 Dockerfile文件 部署脚本deploy.sh 升级脚本upgrade.sh 二.准备Doc ...

  7. 容器时代的DevOps部署

    转载本文需注明出处:微信公众号EAWorld,违者必究. 本文目录: 一.企业应用的部署发展 二.普元容器云与DevOps的部署设计 三.面向微服务的部署设计 四.容器组装化部署 五.容器云集成之路 ...

  8. AOP、动态代理、CGlib(原理实践)

    Java 代理模式实现方式,主要有如下五种方法: 1. 静态代理,工程师编辑代理类代码,实现代理模式:在编译期就生成了代理类. 2. 基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.n ...

  9. docker容器企业级实战——docker部署与操作实践

    docker介绍 什么是docker Docker使用Go语言开发,基于Linux内核的cgroup.namespace以及Unionfs等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于 ...

最新文章

  1. Sublime Text3注册激活和部分配置
  2. 大数据实战之环境搭建(七)
  3. iOS计算输入字符数
  4. 你有必要知道的一些JavaScript 面试题(中)
  5. python字符串处理函数汇总_Python函数汇总
  6. ad从2003升级到2008总结
  7. 如何在Jupyter中运行R语言(两种解决方案)
  8. mysql 修改数据库的数据库_如何更改MySQL数据库的数据库名
  9. 一键搞定数码照片印前特效-【用可牛影像】
  10. gradle对java插件的扩展_Gradle之java插件入门
  11. 教你在 CentOS 8上安装GCC实现开发编译功能
  12. MySQL命令行格式化输出
  13. html图片浮空但占位置,求助:鼠标经过图片时,图片悬浮出现变大
  14. AC日记——丢瓶盖 洛谷 P1316
  15. 无线烟感在文物古建筑的安全防火应用
  16. vscode win10笔记本 蓝屏_老鸟教你win10开机蓝屏0xc000000d的详尽解决办法
  17. 实验室设备管理系统C语言——课程设计实习
  18. Concis组件库封装——Collapse折叠面板
  19. python爬虫系列——拉勾网
  20. PHP 毕生功力 图片,视听发烧网_汇集毕生功力的代表作:静神Monitor Acoustics KenStyle Silver Signature...

热门文章

  1. CS231n Convolutional Neural Networks for Visual Recognition------Python Tutorial
  2. html 地球大气,地球大气层为什么永远不会消失?
  3. delphi webbrowser 显示 html,delphi webbrowser
  4. 盐务街属于一环吗_郑州步入“五环”时代,最早的“一环”原来是这里
  5. ios 代码设置控件宽高比_iOS--利用比例纯代码适配屏幕大小
  6. java工厂模式 uml_深入浅出设计模式-简单工厂模式
  7. java dfs_Java数据结构与算法 深搜(DFS)的简单使用(一)之排列组合
  8. mysql innodb id_MySQL InnoDB row_id边界溢出验证的方法步骤
  9. 三羊献瑞c语言编程入门,蓝桥杯-三羊献瑞,
  10. 关系数据库——mysql常用函数总结