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 {@Overridepublic void add() {System.out.println("添加商品");}@Overridepublic void edit() {System.out.println("修改商品");}@Overridepublic void delte() {System.out.println("删除商品");}@Overridepublic 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方法*/@Overridepublic 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 {@Testpublic 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() {@Overridepublic 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 {@Testpublic void testCglibProxy() {ProductService target = new ProductService();CglibProxy cglibProxy = new CglibProxy(target);ProductService proxy = (ProductService) cglibProxy.createProxy();proxy.add();proxy.edit();proxy.delte();proxy.select();} }
运行结果:
其实除了动态代理,还有静态代理,以后总结设计模式的时候再详细说。设计模式之 代理模式
转载于:https://www.cnblogs.com/blazeZzz/p/9311045.html
Spring总结七:AOP动态代理的实现相关推荐
- spring中AOP动态代理的两种方式
AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...
- Spring AOP源码解析——AOP动态代理原理和实现方式
2019独角兽企业重金招聘Python工程师标准>>> Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和 ...
- Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题
Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题 参考文章: (1)Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代 ...
- Spring AOP动态代理
导入依赖: <dependency><groupId>org.springframework</groupId><artifactId>spring-a ...
- java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)
java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理 基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...
- AOP动态代理的实现机制
2019独角兽企业重金招聘Python工程师标准>>> 1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字 ...
- [Spring手撸专栏学习笔记]——把AOP动态代理,融入到Bean的生命周期
本文是学习<Spring 手撸专栏>第 10 章笔记,主要记录我的一些debug调试过程,方便后期复习.具体学习,大家可以去看一下这个专栏,强烈推荐. 方案 其实在有了AOP的核心功能实现 ...
- Spring之AOP动态代理详解
动态代理 动态代理和静态代理角色一样 动态代理类是动态生成的,不是我们直接写好的. 动态代理分为两大类:基于接口的动态代理:JDK动态代理[我们在这里使用]基于类的动态代理:cglibjava字节码: ...
- spring aop 动态代理模拟
CGLIB 动态代理 public class HouserHost { public void rentHouse() { System.out.println("出租房屋了") ...
- AOP||动态代理||AOP专业术语;
AOP:(Aspect Oriented Programming)面向切面编程: OOP:(Object Oriented Programming )面向对象编程: 面向切面编程:基于OOP基础之上新 ...
最新文章
- 怎么把页面内容填满一页_Excel表格太宽,一张纸打印不下,两张纸又空太多!怎么办?...
- JavaScript 简史
- Linus Torvalds将中国亮相LinuxCon + ContainerCon + CloudOpen
- 干货三:CountDownTimer倒计时工具类
- 联想e550笔记本怎么样_预算5000-6000元笔记本电脑推荐(学生/入门/小白选购)*十二月更新...
- Sqlserver中查询存储过程是否包含某些文本
- WPF richTextBox 滚动到某项
- 【转】Redis的各项功能解决了哪些问题?
- 从零开始学 Web 之 Ajax(五)同步异步请求,数据格式
- windows 2012 安装 .net 3.5报错
- 计算机新建文件夹的步骤打开,如何制作文件夹!(新建文件夹的操作步骤)
- 电脑如何分盘win10_如何给win10电脑系统盘分区?
- 怎样把音频文件转换成mp3格式?
- OWASP Top 10 简单介绍
- 什么是USBHOST、USB Slave和USB OTG?它们之间有什么区别 USB、MiniUSB、MicroUSB
- QT5.12静态编译手册
- 海康直连工具 海康测试工具,工程宝测试软件等
- 微信小程序---快速上手云开发
- ipfs pubsub代码解读
- 新电脑如何分盘---傻瓜式教学
热门文章
- golang errors 取 错误 信息_golang-标准errors包的学习
- PHP JAVA BASE64 encode decode
- 不刷新改变/更换URL: pushState + Ajax
- 伪异步 I/O 编程
- 牛客NOIP暑期七天营-提高组1 解题报告
- 今天突然出现了Property IsLocked is not available for Login '[sa]',我太阳,下面有绝招对付它!...
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_8_Lambda省略格式Lambda使用前...
- 将项目发布到Git@OSC
- DesignPattern_Java:设计模式分类和设计原则
- 360杀毒引发的DLL调用异常