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的缩写,意为:面向切面编程.他是一种可以在不修改原来的核心代码的情况下给程序动态统一进 ...
随机推荐
- mvc razor页面的邮箱校验
由于@符号是razor中的关键字,而邮箱校验的正则表达式中需要使用@符号,所以在cshtml页面的代码中直接写js代码进行邮箱校验会报错. 解决方案: 将邮箱校验写在js文件中,在cshtml文件中引 ...
- npm常用命令解析
npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安装的包. npm ...
- 解决Matlab启动时 " Can't check 9.0 VCRTs The application has failed to start because……" 的错误
注:转载或引用请注明出处 今天在winserver 2012 r2 上安装matlab 2016b , 安装完成运行时提示: ERROR: Cnn't check 9.0 VCRTs <star ...
- 利用百度地图API,在浏览器中找到自己的位置
首先你得有个百度地图的秘钥,http://lbsyun.baidu.com/apiconsole/key 剩下的就是编码了 这里面会用到一个javascript里的一个函数,getMyLocation ...
- 为sublime text2 添加SASS语法高亮
以前写CSS时,都是直接写样式,没有任何的第三方工具,后面发现越是面向大网站,越难管理,上次参加完携程UED大会后,发现SASS对于前端团队多人协作和站点代码维护上很有帮助,很多同学都开始用了,我还是 ...
- 被FBI点名的中国黑客-Lion
网名:Lion(狮子) 真实姓名:林勇 QQ:21509 简介:红客联盟创始人(该组织在2001年5月的黑客大战中一举成名,会员人数最多时达到6万,很有影响力),现在安氏因特网安全系统(中国) ...
- Google考虑抛弃Cookies机制
根据华尔街日报的报道,Google 正在考虑抛弃古老的浏览器 cookies 来追踪用户信息的机制.作为替代,Google 将开发一种「个人匿名标识机制」.Google 早前已经计划在 IE 和 iP ...
- Yours 的博客开张啦!
虽然申请博客已经1个月了,但是一直没有来写,没办法,题都刷不完,哪有心思写啊``` 现在集训终于完了,有了属于自己的时间了.所以该把以前做的题,学的算法好好的整理整理了.一来顺顺思路,二来也可以给后来 ...
- Linux用户行为日志审计
http://my.oschina.net/xiangpang/blog/532999 http://my.oschina.net/chaichuan/blog/508494 http://my.os ...
- Android 常用UI控件之TabHost(2)简单示例
1,布局 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tool ...