Spring的AOP-底层原理
目录
1.有两种动态代理
第一种:有接口情况,使用JDK动态代理
第二种:无接口情况,使用CGLIB动态代理
2.使用JDK动态代理,使用Proxy类里面的方法创建代理对象
步骤一:
步骤二:
步骤三:
3.编写JDK动态代理代码
(1)创建接口,定义方法
(2)创建接口实现类,实现方法
(3)使用Proxy类创建接口代理对象
测试结果:
Spring的AOP-底层原理
1.有两种动态代理
第一种:有接口情况,使用JDK动态代理
步骤:创建接口实现类代理对象,增强类的方法
第二种:无接口情况,使用CGLIB动态代理
步骤:创建子类的代理对象,增强类的方法
2.使用JDK动态代理,使用Proxy类里面的方法创建代理对象
步骤一:
打开JDK8 的开发文档查看的proxy类
步骤二:
往下拉找到一个方法:
步骤三:
调用 newProxyInstance 方法实现JDK动态代理
分析这个方法:
newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)
方法有三个参数:
第一个参数 ClassLoader loader:得到类加载器
第二个参数 类<?>[] interfaces:增强方法所在的类,这个类实现的接口,支持多个接口(因为[]代表的是数组)
第三个参数 InvocationHandler h:实现这个接口 InvocationHandler,创建代理对象,写增强的方法
3.编写JDK动态代理代码
(1)创建接口,定义方法
package com.lbj.spring5;public interface UserDao {public int add(int a,int b);public String update(String id);
}
(2)创建接口实现类,实现方法
package com.lbj.spring5;public class UserDaoImpl implements UserDao{@Overridepublic int add(int a, int b) {System.out.println("add方法执行");return a+b;}@Overridepublic String update(String id) {System.out.println("update方法执行");return id;}
}
明确我们要做什么:通过动态代理的方式,add()方法和update()方法做个增强
(3)使用Proxy类创建接口代理对象
代理对象需要传递到代理类中 ,类代理对象是UserDao的实现类
UserDaoImpl中的add()方法需要被增强 ,所以需要把UserDaoImpl的对象传递到代理类中
package com.lbj.spring5;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;public class JDKProxy {public static void main(String[] args) {//创建接口实现类代理对象Class[] interfaces={UserDao.class};//相当于new了一个接口实现类,赋予接口,且这个实现类叫代理类UserDaoImpl userDaoImpl=new UserDaoImpl();//传入对象userDaoImpl//返回代理对象// Object o = Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDaoImpl));//强转,接口等于实现类的代理对象UserDao userDao =(UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDaoImpl));int result = userDao.add(1, 2);System.out.println("result:"+result);}}//创建代理对象代码
class UserDaoProxy implements InvocationHandler{//1.把被代理对象传递进来//如何传递:通过有参构造传递private Object object;public UserDaoProxy(Object object){this.object=object;}//增强的逻辑@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法之前System.out.println("方法执行之前....."+method.getName()+":传递的参数"+ Arrays.toString(args));//被增强的方法执行Object res=method.invoke(object,args);//方法之后System.out.println("方法之后执行...."+object);return res;}
}
测试结果:
Spring的AOP-底层原理相关推荐
- [Spring5]AOP底层原理
AOP底层原理 1.AOP底层使用动态代理 (1)有两种情况动态代理 第一种 有接口的情况,使用JDK动态代理 a.创建接口实现类代理对象,增强类的方法 第二种 没有接口的情况,使用CGLIB动态代理 ...
- AOP底层原理与注解配置详解
注解开发AOP制作步骤: 在XML格式基础上 导入坐标(伴随spring-context坐标导入已经依赖导入完成 开启AOP注解支持 配置切面@Aspect 定义专用的切入点方法,并配置切入点@Poi ...
- Spring 实现Aop的原理与示例
Spring 实现Aop的原理 Spring Aop AOP(Aspect Oriented Programming),意思为:面向切面编程,是一种通过预编译方式和运行期间动态代理实现程序功能的统一维 ...
- Spring之Aop底层剖析(上)
Spring之Aop底层源码剖析(上) 随着笔者变得越来越懒[好久没有更新博文了],已经抽不住来时间去单独针对某些技术点去单独记录或者长编大论的分析,因为博文还是短点才能让读者从心里上愿意去看. 一. ...
- 【Spring】AOP底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂加工原始对象
一.AOP概念 AOP (Aspect Oriented Programing) 面向切面编程 = Spring动态代理开发 以切面为基本单位的程序开发,通过切面间的彼此协同,相互调用,完成程序的构建 ...
- 【Spring源码】Spring中的AOP底层原理分析
AOP中的几个概念 Advisor 和 Advice Advice,我们通常都会把他翻译为通知,其实很不好理解,其实他还有另外一个意思,就是"建议",我觉得把Advice理解为&q ...
- Spring中的Aop底层原理
Aop底层 aop底层使用的是动态代理,分为两种情况: 第一种:要增强的类实现了接口,使用JDK 动态代理 第二种: 没有接口情况,使用 CGLIB 动态代理 2.下面具体介绍下JDK动态代理 jdk ...
- SpringBoot3【① 基本框架原理+常用注解及其底层+AOP底层原理+yaml和日志框架】
SpringBoot3-特性介绍和快速入门 1.简介 1. 前置知识 Java17 Spring.SpringMVC.MyBatis Maven.IDEA 2. 环境要求 环境&工具 版本(o ...
- 拜托,面试请不要再问我 Spring Cloud Alibaba 底层原理
大家好,今天给大家介绍一个非常热门的技术,同时也是面试的时候面试官特别喜欢问的一个话题,那就是SpringCloudAlibaba的底层原理. 现在大家都知道,SpringCloudAlibaba 风 ...
- Spring 之AOP技术原理剖析
2019独角兽企业重金招聘Python工程师标准>>> 转载自:http://greenyouyou.blog.163.com/blog/static/138388147201181 ...
最新文章
- html实现pdf预览打印机,Pdf操作(HTML转PDF,PDF直接网页连接打印机)
- Could not find destination factory for transport解决方法
- s := time.Now().Format(20060102) go格式化
- 网络埋藏了怎样的物联网智慧?
- php修改音频文件_解析用PHP读写音频文件信息的详解(支持WMA和MP3)
- SAP 手工清帐处理
- JSP简单练习-省略显示长字符串
- 7限制cpu使用_Kubernetes 资源配额使用指南 | Linux 中国
- TensorFLow 常用错误总结
- WPF 绕圈进度条(一)
- python产品发布会_大型发布会现场的 Wi-Fi 应该如何搭建?
- leaks Android内存泄露,Android LeakCanary 检测内存泄露
- 你不可不知道的CSS水平+垂直居中方案大全
- armadillo: run time error: need lapack
- Mysql插件HandlerSocket的应用
- python 隐含波动率_python - QuantLib XL隐含波动率 - 堆栈内存溢出
- android按钮被遮住,解决Android 虚拟按键遮住了页面内容的问题
- java outer什么意思_java里面outer、 inner是什么意思
- 【特征检测】HOG特征算法
- 英文论文写作常用词汇及句型
热门文章
- maven常用插件功能
- MyEclipse配置Tomcat 6
- jQuery源码研究01
- linux的常用操作——程序调试gdb
- HashMap源码分析(搞懂HashMap看这个就够了)
- html与js与mysql_WebView加载html与JS交互
- java右移位_java中的左移 右移
- php console postman,postman内置脚本说明
- cat命令详解_需要!Linux常用监视和故障排查命令详解
- mysql 8 修改root密码忘记_忘记mysql8或者mariadb5及以上 的root密码如何更改