Spring笔记(三)AOP前篇之动态代理
AOP思想是将程序中的业务代码与服务代码进行分离,在运行时进行结合。比较强调程序的层次结构,是一种面向切面的编程。而在AOP实现的底层主要用到了动态代理,而动态代理又分为JDK动态代理和CGLIB动态代理,两者的区别是JDK动态代理的实现中业务类必须必须定义接口,而CGLIB没有这个约束,可以说CGLIB更强大;
JDK动态代理实现示例:
| 1 | // 业务接口定义 |
| 2 | public interface IUnit { |
| 3 | void execute(String msg); |
| 4 | } |
| 5 | |
| 6 | // 业务实现类 |
| 7 | public class Unit implements IUnit{ |
| 8 | @Override |
| 9 | public void execute(String msg) { |
| 10 | System.out.println("execute:"+msg); |
| 11 | } |
| 12 | } |
| 13 | |
| 14 | // 服务实现类 |
| 15 | public class Reference { |
| 16 | void showMessage(String msg){ |
| 17 | System.out.println("Reference:"+msg); |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | // 动态代理实现类 |
| 22 | public class UnitProxy { |
| 23 | // 业务代码对象 |
| 24 | IUnit iunit = new Unit(); |
| 25 | // 服务代码对象 |
| 26 | Reference reference = new Reference(); |
| 27 | // 获取代理对象 |
| 28 | IUnit getProxy() { |
| 29 | /** |
| 30 | * 函数名:newProxyInstance |
| 31 | * 参数一:代理类类加载器 |
| 32 | * 参数二:服务类接口 |
| 33 | * 参数三:代理对象调用处理程序实现接口 |
| 34 | */ |
| 35 | return (IUnit)Proxy.newProxyInstance(UnitProxy.class.getClassLoader(), iunit |
| 36 | .getClass().getInterfaces(), new InvocationHandler() { |
| 37 | /** |
| 38 | * 函数名:invoke |
| 39 | * 参数一:代理对象 |
| 40 | * 参数二:调用的服务类方法对象 |
| 41 | * 参数三:服务类方法参数 |
| 42 | */ |
| 43 | @Override |
| 44 | public Object invoke(Object proxy, Method method, Object[] args) |
| 45 | throws Throwable { |
| 46 | Object retObject = null; |
| 47 | reference.showMessage("getProxy before"); |
| 48 | retObject = method.invoke(iunit, args); |
| 49 | reference.showMessage("getProxy after"); |
| 50 | return retObject; |
| 51 | } |
| 52 | }); |
| 53 | } |
| 54 | } |
| 55 | |
| 56 | public class TestApplication { |
| 57 | public static void main(String[] args){ |
| 58 | UnitProxy proxy = new UnitProxy(); |
| 59 | IUnit iunit = proxy.getProxy(); |
| 60 | iunit.execute("TestApplication execute"); |
| 61 | } |
| 62 | } |
这段代码中的关键函数为 Proxy.newProxyInstance ,我对它的理解为:通过代理类的类加载器和业务类接口,在代理对象处理程序实现接口中,结合服务对象完成代理对象的构建,代理对象的实现本质是业务类与服务类功能的结合;
在AOP开发中通常会提到目标对象、服务对象、代理对象、连接点、切入点、切面、增强,最后结合以上代码说明下:
UnitProxy 类中的iunit 为目标对象,reference 为服务对象,getProxy方法返回的是代理对象。IUnit 接口中定义的接口全部为连接点,切入点是连接点的子集,也就是复合一定条件的连接点。切面就是服务类Reference。增强是服务类Reference中的方法showMessage;
Spring笔记(三)AOP前篇之动态代理的更多相关文章
- 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】
一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...
- Spring笔记:AOP基础
Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...
- Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题
Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只 ...
- Spring框架中的JDK与CGLib动态代理
JDK和CGLib动态代理区别 JDK动态代理:利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(4):JDK动态代理+拦截器
一.拦截器的理解 学习拦截器之前需要对动态代理和反射有一定的基础. 官方说法: java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个actio ...
- Spring笔记06(Spring AOP的底层实现动态代理)
1.代理模式readMe: 代理设计模式: 是java中常用的设计模式! 特点: .委托类和代理类有相同的接口或者共同的父类! .代理类为委托类负责处理消息,并将消息转发给委托类! .委托类和代理类对 ...
- 二)Spring AOP编程思想与动态代理
一.aop编程思想 1.面向切面,就是能够不动源码的情况下,从横切面切入新的代码功能. 2.实现原理是动态代理 动态代理的步骤 a.写生产厂家,实现接口,代理只能代理接口 b.动态代理类实现Invoc ...
- 浅析Spring中AOP的实现原理——动态代理
一.前言 最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...
- Spring笔记三
Spring-03 1. AOP 1.1 概念 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.他是一种可以在不修改原来的核心代码的情况下给程序动态统一进 ...
随机推荐
- ColorDialog组件设置字体颜色
1.设置颜色 private void button4_Click(object sender, EventArgs e) { this.colorDialog1.ShowDialog(); this ...
- office2016 部分截图
哈啊哈哈啊哈 看看吧~~~~~~~~~~~~~~~~~
- ExtJS4.2学习(19)在线编辑器Ext.form.HtmlEditor(转)
鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-12-24/191.html --------------- ...
- SecureCRT 中文乱码问题
1.修改远程linux机器的配置 [root@rhel ~]#vi /etc/sysconfig/i18n 把LANG改成支持UTF-8的字符集 如: LANG=”zh_CN.UTF-8″ 或者是 L ...
- 九度 链表中倒数第k个结点
/* * a.cpp * * Created on: 2013-10-7 * Author: wangzhu */ #include<cstdio> #include<iostrea ...
- DHTMLX 前端框架 建立你的一个应用程序 教程(十)--保存表单中的数据
保存表单中的数据 现在我们所要做的是 当用户点击提交按钮的时候 我们将表单中的数据进行保存操作. 我们可以使用dhtmlxDataProcessor. 来进行操作.它是一个数据组件,可以提供与服务器 ...
- 安装edX DevStack
概述 edX Developer Stack 就是通常我们所说的Devstack,是为本地开发所设计的一个Vagrant实例. Devstack: 和产品(edx Product Stack)对系统的 ...
- 使用php实现权限管理模块
在说权限管理模块前,应该先知道权限管理模块要有哪些功能: 1.用户只能访问,指定的控制器,指定的方法 2.用户可以存在于多个用户组里 3.用户组可以选择,指定的控制器,指定的方法 4.后台可以添加 ...
- 【原创】MIPS·Verilog·FPGA
时至今日,终于将全部的计划55条MIPS指令在FPGA上全部验证完毕,通过这近一个月的不断的修改调试.修改调试,我对整个流程对MIPS有了深刻的体会和认识.借着刚刚现阶段任务的兴奋和短暂的空闲时间,将 ...
- 应付分配集 Distribution Sets
(N) AP > Setup > Invoice > Distribution Sets (定义分配集) You can use a Distribution Set to auto ...