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 ...
随机推荐
- C++中标准输入流cin与Ctrl+Z使用时的问题
今天使用C++编写了一段小程序,练习使用标准库的算法,代码如下: #include <iostream> #include <algorithm> #include <v ...
- MAC版画图软件 paintbrush 推荐,类似 windows 上系统自带的画图软件
不想开photoshop这么重的软件,但是对于屏幕截图有需要有一点处理.这时候我想起 windows上画图的好了. 搜索了一下,知道了 paintbrush 这个软件,于是下载试用了一下,果然很好. ...
- IOS socket编程--Asyncsocket
iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作 主要特性有: 队列的非阻塞的读和写, ...
- 把color转成image的方法
- (UIImage*)createImageWithColor:(UIColor*) color { CGRect rect=CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); ...
- LeetCode Maximum Swap
原题链接在这里:https://leetcode.com/problems/maximum-swap/description/ 题目: Given a non-negative integer, yo ...
- DispatcherServlet的处理流程
前言 上一篇介绍了SpringMVC的启动过程,DispatcherServlet作为一个前端控制器,分发处理http请求 1.DispatcherServlet流程图 具体流程: 1. 用户发请求- ...
- FastAdmin 后台 UserRule 勾选不完整 Bug 修复
FastAdmin 后台 UserRule 勾选不完整 Bug 修复 当用户权限的级选择时出现有部分没有选中. 修复来自在 qmit 1 public static function getTreeL ...
- 在html与php中实现上传图片
form.html文件 <body> 点击浏览按钮添加要上传的文件(*请上传大小不能大于2M的静态图片)<br /> <form enctype="multip ...
- IaaS vs PaaS vs SaaS
在云计算的早期阶段,企业面临的最大问题是他们是否应该使用公共云服务.如今,几乎所有的组织都在采用一些公共云服务.更重要的问题是企业应该使用哪种云服务:基础设施即服务(IaaS),平台即服务(PaaS) ...
- Avalon总线概述
Nios系统的所有外设都是通过Avalon总线与Nios CPU相接的,Avalon总线是一种协议较为简单的片内总线,Nios通过Avalon总线与外界进行数据交换. Avalon总线接口分类 可分为 ...