首页 > 其他分享 >Spring系列之(七)动态代理

Spring系列之(七)动态代理

时间:2024-02-27 20:59:09浏览次数:22  
标签:对象 Spring 代理 接口 参数 动态 方法

动态代理

1. 特点

字节码随用随创建,随用随加载

2. 作用

不修改类的源码基础上对类的方法进行增强

3. 分类

  1. 基于接口的动态代理
  2. 基于子类的动态代理

4. 基于接口的动态代理

4.1 涉及的类

Proxy

4.2 提供者

JDK官方

4.3 如何创建代理对象

Proxy的newProxyInstance方法

4.4 创建代理对象的要求

被代理类最少实现一个接口,如果没有则不能使用

4.5 newProxyInstance方法的参数

参数 功能 写法
ClassLoader loader 用于加载代理对象的字节码 被代理类的对象的类加载器,写法固定
Class<?>[] interfaces 用于让代理对象和被代理对象有相同方法 被代理类的实现接口,固定写法
InvocationHandler h 用于提供增强的代码 一般是InvocationHandler接口的实现类,通常情况下是匿名内部类,但不必须,该接口的实现类都是谁用谁写
注:匿名内部类使用成员变量,要求成员变量是被final修饰的

4.6 InvocationHandler接口中的invoke方法

通过代理对象调用被代理对象的任何接口方法都会经过该方法

4.6.1 参数含义
参数 功能
Object proxy 代理对象的引用,一般用不到
Method method 当前执行的方法
Object[] args 当前执行方法所需的参数
4.6.2 返回值含义

和被代理对象方法有相同的返回值

4.7 实现

IProducer接口
在这里插入图片描述
IProducer实现类
在这里插入图片描述
在这里插入图片描述
测试结果
在这里插入图片描述

5. 基于子类的动态代理

5.1 涉及的类

Enhancer

5.2 提供者

第三方cglib库

5.3 如何创建代理对象

Enhancer的create方法

5.4 创建代理对象的要求

被代理类不能是最终类,即被代理类是可以被继承的

5.5 create方法的参数

参数 功能 写法
Class type 用于加载代理对象的字节码 被代理类的对象的字节码,写法固定
Callback callback 用于提供增强的代码 一般是Callback接口的子接口MethodInterceptor的实现类,通常情况下是匿名内部类,但不必须,该接口的实现类都是谁用谁写
注:匿名内部类使用成员变量,要求成员变量是被final修饰的

5.6 MethodInterceptor接口中的intercept方法

通过代理对象调用被代理对象的任何接口方法都会经过该方法

5.6.1 参数含义
参数 功能
Object o 代理对象的引用,一般用不到
Method method 当前执行的方法
Object[] objects 当前执行方法所需的参数
MethodProxy methodProxy 当前执行方法的代理对象,一般用不到
5.6.2 返回值含义

和被代理对象方法有相同的返回值

5.7 实现

pom中导入坐标
在这里插入图片描述
被代理类
在这里插入图片描述
在这里插入图片描述
测试结果
在这里插入图片描述

动态代理彻底将业务层代码和事务管理进行分离,解决了方法间的依赖问题

标签:对象,Spring,代理,接口,参数,动态,方法
From: https://www.cnblogs.com/wzzzj/p/18038228

相关文章

  • Spring系列之(六)Spring整合Junit
    Spring整合Junit上面部分的内容是把8.3.7节的第一个问题给解决了,我们来看第二个问题(测试代码开发和测试部分耦合度高,图中标红部分一般测试人员无法完成)pom中导入Spring整合Junit的坐标使用Junit提供的@RunWith注解把Junit原有的main方法替换成Spring提供的main方法告知Sprin......
  • Spring系列之(五)Spring基于注解的IOC
    Spring基于注解的IOC1.构建注解环境在beans.xml中加入context名称空间和约束<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&......
  • Spring系列之(四)Spring的依赖注入
    Spring的依赖注入在当前类需要用到其他类的对象,其他类的对象也是由Spring创建并将引用传递给当前类的对象的,我们只需要在配置文件中说明,说白了就是为当前类填充(也叫注入)其他类的对象1.能够注入的数据能够注入的数据是指支持注入的这部分数据是可以被Spring填充(注入)到当前类的......
  • Spring系列之(三)Spring对Bean的管理细节
    Spring对Bean的管理细节1.创建Bean的三种方式使用默认构造函数创建bean标签仅配置id和class,即标识和全限定类名,同时保证要创建的类是有无参构造函数的如果没有无参构造函数,将会报错使用某个类中的方法创建对象,该方法的返回值是某个类的对象以新建的Factory类为例,需......
  • Spring系列之(二)Spring基于XML的IOC实例
    Spring基于XML的IOC实例将改进后的工厂模式通过Spring来实现,解析配置文件、创建仓库,将对象存入仓库的过程都由Spring来做,我们只需要配置好配置文件,获取仓库中的对象即可1.在pom中引入Spring环境<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.o......
  • Spring系列之(一)Spring概述
    Spring概述1.程序的耦合耦合:程序间的依赖关系解耦:降低程序间的依赖关系分类类之间的依赖方法之间的依赖2.类之间的依赖问题的实例2.1JDBC操作数据库存在的耦合问题首先正常编写一个jdbc查询操作的类packagecom.itheima.jdbc;importjava.sql.*;publicclass......
  • spring boot 中使用MybatisPlus的自动填充createTime和updateTime
    首先需要在实体类的字段上加上注解,并且将类型更改为LocalDateTime@TableField(fill=FieldFill.INSERT)@JsonInclude(value=JsonInclude.Include.NON_NULL)@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss")privateLocalDateTimecreateTime;@TableFie......
  • springboot学习过程中的特殊错误
     这是我在学习使用springboot过程中遇到的一个小问题,询问了gpt但是并没有解决我的报错,在网上浏览信息后最终知道了是哪里出了问题 就如这个好哥哥说的一样,mybatis自带的方法不会出现问题,所以问题出在了实体类定义上面,加了@Tableld的注解就解决了问题。......
  • day43 动态规划part5 代码随想录算法训练营 1049. 最后一块石头的重量 II
    题目:1049.最后一块石头的重量II我的感悟:复习了昨天的模板是不一样,今天这个我推出来了。哈哈 理解难点:按照昨天的思路,dp[target]里面是能凑出来的最大值。a是另外能凑出来的和。diff是两者的差。听课笔记:我自己先写出的代码:classSolution:deflastStoneW......
  • 复习回顾-动态规划算法-416. 分割等和子集
    注意点&感悟:其实也没啥,不行就背呗~~题目链接:416.分割等和子集自己独立写的代码:classSolution:defcanPartition(self,nums:List[int])->bool:target=sum(nums)iftarget%2==1:#说明是奇数returnFalsetarget=......