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;}
}

测试结果:

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python搭建web服务器_Python搭建简单的web服务器

Python搭建简单的web服务器 1.winR输入cmd打开命令行 2.通过 cd 进入到你保存 HTML 文件的目录。例如&#xff1a;H:\D3\d3 输入 cd\ 指令进入到C盘的根目录。&#xff08;CD&#xff08;更改目录&#xff09;。使用此命令可以更改当前目录&#xff09; 这里解释一下cd指令基本…

screnc加密后文件不能执行_芯片加密后还能不能再次使用【详细介绍】

随着信息技术的发展&#xff0c;信息的载体-芯片的运用也越来越多了&#xff0c;随之而来的芯片安全性的要求也越来越高了&#xff0c;各个芯片厂商对芯片保密性要求越来越高&#xff0c;芯片的加密&#xff0c;保证了芯片中的信息的安全性。经常有客户打电话过来问&#xff0c…

Spring的AOP-操作术语

目录 Spring的AOP-操作术语 1.连接点 2.切入点 3.通知 &#xff08;1&#xff09;实际增强的逻辑部分称为通知 &#xff08;2&#xff09;通知有多种类型 4.切面 Spring的AOP-操作术语 1.连接点 类里面那些方法可以被增强&#xff0c;这些方法称为连接点 2.切入点 类里…

向别人网页注入js_区块链研究实验室 | Web3 .js基于以太坊的Javascript API

web3.js是一个库集合&#xff0c;你可以使用HTTP或IPC连接本地或远程以太它节点进行交互。 web3的JavaScript库能够与以太坊区块链交互。 它可以检索用户帐户&#xff0c;发送交易&#xff0c;与智能合约交互等。Version : 1.0.0-beta.36Web3.js API类型eth&#xff1a;Etherum…

python绘制动态图表怎么存下来_做动态图表,没有数据?用Python就能获取!

这是小F在国庆之前写的一篇文章&#xff0c;全网阅读累计达到3万。 既然有了Python这个制作动态条形图工具&#xff0c;缺的那便是数据了。 先看一下B站2019年「数据可视化」版块的情况&#xff0c;第一个视频超2百万的播放量&#xff0c;4万的弹幕。 小F自己在B站上制作的几个…

Spring的AOP-准备工作

目录 Spring的AOP-准备工作 1.Spring框架一般基于 AspectJ 实现AOP操作 2.基于AspectJ 实现 AOP 操作 &#xff08;1&#xff09;基于xml 配置文件实现 &#xff08;2&#xff09;基于注解方式实现【常用】 3.在项目工程用引入AOP 相关依赖 步骤一&#xff1a;找到依赖包…

python 小说 云_小说python操作PLC

PLC(Programmable Logic Controller)可编程逻辑控制器&#xff0c;可以理解为一个微型计算机&#xff0c;广泛应用于工业控制中&#xff0c;如楼宇智控、精密机床、汽车电子等等。 随着物联网的兴起&#xff0c;越来越多的传统工业设备需要和外界通信&#xff0c;但很多情况下&…

stream去重_使用Java Stream API中DistinctBy删除重复数据

Stream API提供distinct()方法&#xff0c;该方法基于数据Object类的equals()方法返回列表的不同元素。下面先做一个数据Object类&#xff0c;用来发现重复数据&#xff1a;public class LegacyObject {private final UUID id;private final String foo;private final int bar;…

Spring的AOP-AspectJ注解方式

目录 Spring的AOP-AspectJ注解方式 1.创建类&#xff0c;在类里面定义方法 2.创建增强类 3.进行通知的配置 &#xff08;1&#xff09;在Spring 配置文件中&#xff0c;开启直接扫描 &#xff08;2&#xff09;使用注解创建User 和 UserProxy 对象 &#xff08;3&#x…

python turtle绘制柱状图_python绘制图形(Turtle模块)

用python的Turtle模块可以绘制很多精美的图形&#xff0c;下面简单介绍一下使用方法。 需要用到的工具有python&#xff0c;python 的安装这里就不再细说。自行搜索。 from turtle import * #引入turtle模块 color(red, yellow) #设置绘制的颜色和填充颜色 # 海龟设置 hideturt…

laravel商品图片怎么展示_如何使用Laravel图片处理包intervention-image

下面由Laravel教程栏目给大家介绍如何使用Laravel图片处理包intervention-image&#xff0c;希望对需要的朋友有所帮助&#xff01;最近偶然发现了Laravel可用的图片处理包intervention-image。文档地址&#xff1a;http://image.intervention.io安装起来也很简单。composer re…

JdbcTemplate(概念和准备)

目录 1.什么是jdbcTemplate 2.使用前准备工作&#xff1a; &#xff08;1&#xff09;引入相关jar包 &#xff08;2&#xff09;在spring 配置文件配置数据库连接池​ &#xff08;3&#xff09;配置jdbcTemplate 对象&#xff0c;注入 DataSource &#xff08;4&#xf…

python shape函数_Python中的多态及抽象类

本书同名免费MOOC《Python编程基础及应用》在哔哩哔哩(B站)热播&#xff0c;作者带着你学。版权声明&#xff1a;本文内容引用自作者的图书《Python编程基础及应用》(高等教育出版社)。本文可以在互联网上转载传播&#xff0c;但必须包含文中的版权声明&#xff1b;本文不可以以…

idea搭建maven项目关于数据库连接jar包版本问题解决方案

SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required 将mysql-connector-java由5.1.34升级到了6.0.6&#xff0c;本机MySQL5.7使用没问题&#xff0c;连测试服务器MySQL5.5创建数据库连接报错 解决方案&#xff1a; 将mysql-connector-java的版本退回到5.1.34…

二叉树的递归遍历|前中后序遍历、最大深度、最大直径

二叉树的递归遍历 前序遍历 public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();if (root null) {return res;}res.add(root.val);if (root.left ! null) {res.addAll(preorderTraversal(root.left));}if (roo…

python对象的三个属性_Python 对象属性的访问

在 Python 中&#xff0c;一切皆对象。属性访问可以理解为是从一个已有的对象中获得另一个对象的方法。对象属性的访问涉及到对象的 __dict__ 属性、描述符等概念&#xff0c;以及 __getattribute__、__getattr__ 等方法。 对象字典属性 Python 中的对象有一个 __dict__ 属性&a…

JdbcTemplate(操作数据库-添加功能)

目录 JdbcTemplate&#xff08;操作数据库-添加功能&#xff09; 1.建立数据库表&#xff1a; 2.对应数据库创建实体类&#xff1a; 3.编写service 和 dao &#xff08;1&#xff09;在 dao 层进行数据库添加操作 &#xff08;2&#xff09;具体&#xff1a;调用jdbcTemp…

python读取大文件csv_实现读取csv文件,文件里面是有限个百分数成绩(99.6、76.8等等...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 实现读取csv文件&#xff0c;文件里面是有限个百分数成绩&#xff08;99.6、76.8等等&#xff09;导出GPA 和等级代码是这样&#xff0c;但是报错了&#xff0c;在score float(sc)这行就报错了&#xff0c;下面有没有错误还不知道…

JdbcTemplate(操作数据库-修改和删除功能)

目录 JdbcTemplate&#xff08;操作数据库-删除功能&#xff09; 1.创建数据库 2.配置文件实现 3.创建实体类 4.创建dao层 5.创建service层 6.测试类 7.测试结果&#xff1a; JdbcTemplate&#xff08;操作数据库-删除功能&#xff09; 1.创建数据库 user_db数据库的t_…

单片机定时器实验两位倒计时秒表_51单片机基础与应用8天速成(三)

在讲授中断这一概念时&#xff0c;人们总是喜欢举洗衣服烧水的例子&#xff1a;话说&#xff0c;一天“你”独自在家&#xff0c;为了泡脚给自己烧上了一壶水&#xff0c;然后想着明天没有衣服穿了&#xff0c;就去阳台洗起了衣服。过了十几分钟&#xff0c;“你”在阳台洗着衣…