Spring总结七:AOP动态代理的实现
Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。
首先我们来用代码简单演示jdk动态代理:
现在有一个商品的增删改查的操作
/**
* 商品操作接口
*/
public interface ProductService {
public void add();
public void edit();
public void delte();
public void select();
} /**
* 实现类
*/
public class ProductServiceImpl implements ProductService {
@Override
public void add() {
System.out.println("添加商品");
} @Override
public void edit() {
System.out.println("修改商品");
} @Override
public void delte() {
System.out.println("删除商品");
} @Override
public void select() {
System.out.println("查询商品");
}
}
我们编写一个基于jdk的动态代理(实现InvocationHandler接口):
public class JdkProxy implements InvocationHandler {
//被代理的目标
private Object target;
//构造函数 传入目标对象
public JdkProxy(Object target) {
this.target = target;
}
//提供创建代理对象的方法
public Object createProxy() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
/**
* 实现InvocationHandler接口的回调方法, 拦截目标对象所有方法都会执行invoke方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是代理,我对被代理的目标有绝对的控制权...");
Object returnVal = method.invoke(target, args);
System.out.println("--------------------------------------");
return returnVal;
}
}
测试代码:
public class JdkProxyTest {
@Test
public void testJdkProxy() {
//创建对象
ProductService target = new ProductServiceImpl();
//创建代理对象
JdkProxy jdkProxy = new JdkProxy(target);
//代理面向接口
ProductService proxy = (ProductService) jdkProxy.createProxy();
//通过代理调用方法
proxy.add();
proxy.edit();
proxy.delte();
proxy.select();
}
}
运行结果:

jdk的代理,目标必须有接口
而cglib的代理不管有没有接口都可以
下面简单说一下cglib的动态代理:
ProductService
public class ProductService {
public void add() {
System.out.println("添加商品");
}
public void edit() {
System.out.println("修改商品");
}
public void delte() {
System.out.println("删除商品");
}
public void select() {
System.out.println("查询商品");
}
}
CglibProxy:
public class CglibProxy {
private Object target;
public CglibProxy(Object target) {
this.target = target;
}
public Object createProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
// 增强的功能
System.out.println("这么巧,我也是代理.......................");
// 原来的功能
Object returnVal = method.invoke(target, args);
return returnVal;
}
});
// 返回 代理对象(增强之后的对象)
return enhancer.create();
}
}
测试代码:
public class CglibProxyTest {
@Test
public void testCglibProxy() {
ProductService target = new ProductService();
CglibProxy cglibProxy = new CglibProxy(target);
ProductService proxy = (ProductService) cglibProxy.createProxy();
proxy.add();
proxy.edit();
proxy.delte();
proxy.select();
}
}
运行结果:

其实除了动态代理,还有静态代理,以后总结设计模式的时候再详细说。设计模式之 代理模式
Spring总结七:AOP动态代理的实现的更多相关文章
- spring源码-aop动态代理-5.3
一.动态代理,这是一个很强大的东西哦.研发过程中我们会常用很多业务类,但是存在一个问题.如何在不修改源码逻辑的情况下,加入自己的相关逻辑.比如异常处理,日志记录等! 二.Java动态代理的两种方式JD ...
- Spring学习笔记之aop动态代理(3)
Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...
- Spring中的cglib动态代理
Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...
- Spring中的JDK动态代理
Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层 ...
- Spring事务Transactional和动态代理(二)-cglib动态代理
系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...
- Spring事务Transactional和动态代理(三)-事务失效的场景
系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...
- 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)
黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...
- Spring事务Transactional和动态代理(一)-JDK代理实现
系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...
- Spring AOP 动态代理 缓存
Spring AOP应用:xml配置及注解实现. 动态代理:jdk.cglib.javassist 缓存应用:高速缓存提供程序ehcache,页面缓存,session缓存 项目地址:https://g ...
随机推荐
- [置顶]
Android开发百科全书
友情提示根据目录 快速查找问题 %1$s %1$d Android string 1.整型,比如"我今年23岁了",这个23是整型的.在string.xml中可以这样写,<s ...
- Leetcode 1005. Maximize Sum Of Array After K Negations
class Solution(object): def largestSumAfterKNegations(self, A, K): """ :type A: List[ ...
- js 获取服务器当前时间
//获取服务器时间 function getNowDate(){ var xhr = null; if(window.XMLHttpRequest){ xhr = new window.XMLHttp ...
- 【解题报告】2014ACM/ICPC上海赛区现场赛B
唉 谷歌出的神题,差点爆零了...三小时终于A掉 B题 题目大概是说从左上角的点出发,经过某路线最后回到原点,求每个格子被路线包含的圈数的平方和. 首先可以知道,对于某个格子来说,从该格子的任意一个 ...
- 查找对应jar的maven包
当原有项目换成maven项目时,往往不知道具体jar包在maven里叫什么.这边文章教你如何去找到自己想要的jar的maven包. 工具/原料 浏览器 方法/步骤 1 登录一下网站 http: ...
- 《DSP using MATLAB》示例Example7.21
代码: h = [1, 2, 3, 4, 3, 2, 1]/15; M = length(h); n = 0:M-1; [Hr, w, a, L] = Hr_Type1(h); a L amax = ...
- maxsigma
10^8 768 10^7 448 10^6 240 10^5 128
- LG3391 【模板】文艺平衡树(Splay)
题意 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 \(n,m ...
- 积累 ---- PHP可能会遇到的面试题
1.白盒测试和黑盒测试的区别 2.Bootstrap是什么 3.OOP是什么意思 4.git和svn的使用 5.常用的git命令 6.lamp开发环境 7.高内聚,低耦合
- (转)【Android】获取Mac地址【2】
[Android]获取Mac地址[2] 之前写了[Android]获取Mac地址[1]有些不够详细,现在贴上一些其他代码,仅供参考. (1) 调用android 的API: NetworkInterf ...