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动态代理的实现相关推荐

  1. spring中AOP动态代理的两种方式

    AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...

  2. Spring AOP源码解析——AOP动态代理原理和实现方式

    2019独角兽企业重金招聘Python工程师标准>>> Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和 ...

  3. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

    Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题 参考文章: (1)Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代 ...

  4. Spring AOP动态代理

    导入依赖: <dependency><groupId>org.springframework</groupId><artifactId>spring-a ...

  5. java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)

    java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理     基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...

  6. AOP动态代理的实现机制

    2019独角兽企业重金招聘Python工程师标准>>> 1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字 ...

  7. [Spring手撸专栏学习笔记]——把AOP动态代理,融入到Bean的生命周期

    本文是学习<Spring 手撸专栏>第 10 章笔记,主要记录我的一些debug调试过程,方便后期复习.具体学习,大家可以去看一下这个专栏,强烈推荐. 方案 其实在有了AOP的核心功能实现 ...

  8. Spring之AOP动态代理详解

    动态代理 动态代理和静态代理角色一样 动态代理类是动态生成的,不是我们直接写好的. 动态代理分为两大类:基于接口的动态代理:JDK动态代理[我们在这里使用]基于类的动态代理:cglibjava字节码: ...

  9. spring aop 动态代理模拟

    CGLIB 动态代理 public class HouserHost { public void rentHouse() { System.out.println("出租房屋了") ...

  10. AOP||动态代理||AOP专业术语;

    AOP:(Aspect Oriented Programming)面向切面编程: OOP:(Object Oriented Programming )面向对象编程: 面向切面编程:基于OOP基础之上新 ...

最新文章

  1. 怎么把页面内容填满一页_Excel表格太宽,一张纸打印不下,两张纸又空太多!怎么办?...
  2. JavaScript 简史
  3. Linus Torvalds将中国亮相LinuxCon + ContainerCon + CloudOpen
  4. 干货三:CountDownTimer倒计时工具类
  5. 联想e550笔记本怎么样_预算5000-6000元笔记本电脑推荐(学生/入门/小白选购)*十二月更新...
  6. Sqlserver中查询存储过程是否包含某些文本
  7. WPF richTextBox 滚动到某项
  8. 【转】Redis的各项功能解决了哪些问题?
  9. 从零开始学 Web 之 Ajax(五)同步异步请求,数据格式
  10. windows 2012 安装 .net 3.5报错
  11. 计算机新建文件夹的步骤打开,如何制作文件夹!(新建文件夹的操作步骤)
  12. 电脑如何分盘win10_如何给win10电脑系统盘分区?
  13. 怎样把音频文件转换成mp3格式?
  14. OWASP Top 10 简单介绍
  15. 什么是USBHOST、USB Slave和USB OTG?它们之间有什么区别 USB、MiniUSB、MicroUSB
  16. QT5.12静态编译手册
  17. 海康直连工具 海康测试工具,工程宝测试软件等
  18. 微信小程序---快速上手云开发
  19. ipfs pubsub代码解读
  20. 新电脑如何分盘---傻瓜式教学

热门文章

  1. golang errors 取 错误 信息_golang-标准errors包的学习
  2. PHP JAVA BASE64 encode decode
  3. 不刷新改变/更换URL: pushState + Ajax
  4. 伪异步 I/O 编程
  5. 牛客NOIP暑期七天营-提高组1 解题报告
  6. 今天突然出现了Property IsLocked is not available for Login '[sa]',我太阳,下面有绝招对付它!...
  7. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_8_Lambda省略格式Lambda使用前...
  8. 将项目发布到Git@OSC
  9. DesignPattern_Java:设计模式分类和设计原则
  10. 360杀毒引发的DLL调用异常