spring中AOP动态代理基本原理

【Spring Boot实战与进阶】AOP的两种动态代理(JDK和Cglib) 在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程) 阅读详情

spring中AOP动态代理基本原理  

2012-11-20 14:42:06|  分类: spring|字号 订阅

     spring的AOP中,代理技术是重要的部分,spring的AOP默认采用了动态代理机制。下面模拟一下动态代理机制的实训

假设有个接口UserDAO:

package com.gdsyhgxy.dao;

import com.gdsyhgxy.model.User;

public interface UserDAO {
 public void add(User u);
 public void delete(int id); 
}

实现UserDAO的UserDAOImpl

package com.gdsyhgxy.dao.impl;

import com.gdsyhgxy.dao.UserDAO;
import com.gdsyhgxy.model.User;

public class UserDAOImpl implements UserDAO {
 public void add(User u) {
  // TODO Auto-generated method stub
  System.out.println("a user save");
 }
 public void delete(int id) {
  // TODO Auto-generated method stub
  System.out.println("a user delete");
 }

}

那么如果现在有这样一个业务逻辑,就是在add(User u)执行前加点业务逻辑,在其执行之后加点业务逻辑,这时就像再原来添加用户的业务逻辑上加上了横向的条件进去,这就是所谓的面向切面的编程思想,类似此种情况,使用动态代理尤为适合。

那么怎么样产生一个动态代理类呢,要用到JDK里面的Proxy类和InvocationHandler类

Proxy中的newProxyInstance(ClassLoader loader;Class<?>[] Interfaces,InvocationHandler h)可以用来产生动态代理

ClassLoader loader是类加载器

Class<?>[] Interfaces是被代理类实现的接口

InvocationHandler h;InvocationHandler接口的之类的实例;

 

InvocationHandler类中invoke(Object proxy,Method m,Object[] args);

Object proxy:被代理对象,

Method m:被调用的方法;

Object[] args:被调用方法的参数;

 

下面是实现动态代理类的代码

package com.gdsyhgxy.dao.impl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class UserDAOImplInvcationHandler implements InvocationHandler {
 //声明被代理对象;
 private Object targetObject;
 //通过被代理对象得到代理对象
 public Object newProxy(Object targetObject){
  this.targetObject = targetObject;
  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this);
 }

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  beforeMethod(method);
  method.invoke(targetObject,args);
  behindMethod(method);
  return null;
 }

//在方法执行前加的业务逻辑
 private void beforeMethod(Method method){
  System.out.println(method.getName()+" start");
 }

//在方法执行后加的业务逻辑
 private void behindMethod(Method method){
  System.out.println(method.getName()+" end");
 }
}

方便起见,这里在方法前后加的业务逻辑都简单的写成一个打印语句,

在主函数中测试:

UserDAO dao = new UserDAOImpl();
 UserDAOImplInvcationHandler handler = new UserDAOImplInvcationHandler();
 UserDAO userDAO = (UserDAO)handler.newProxy(dao);
 userDAO.delete(1);

控制台打印出:
delete start
a user delete
delete end

这时我们会想为什么调用的是userDAO的delete方法,怎么前面后面就都加上了业务逻辑了呢?注意:UserDAO是这样子产生的

 UserDAO userDAO = (UserDAO)handler.newProxy(dao);也就是UserDAO实际上已经是个代理对象了,因为在创建代理对象的时候用到Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this);,传进去的有被代理对象的类加载器,被代理对象实现的接口,和InvocationHandler接口的之类的实例,可以知道,代理对象也将实现被代理对象实现过的接口,其也拥接口中定义的方法,但是在代理中是怎么调用其里面的方法使得方法前后都加上所需的业务逻辑的。

大概如下

class $Proxy4 implement UserDAO{

   public void  save(User u){

       Method m = UserDAO.getClass.getMethod("save") ;

      handler .invoke(this,m,u);

  }

}

这个解释是基于上面程序说明的,这里的handler 指的是前面程序写的UserDAOImplInvcationHandler handler = new UserDAOImplInvcationHandler();中的handler ;

由此我们就可以知道,代理里面在调用每个方法时都是去调用了实现动态代理类中的invoke的方法,所以我们只需要根据自己的需要在invoke方法里加入所需的业务逻辑既可。

这种动态代理的实现补充了传统面向对象编程的不足,代码耦合性大大降低,当要使用动态代理时我们将其加入,不用是很方便的就将其摘掉。

使用动态代理可以做如验证权限,方法效率测试,日记记录等等

Spring : Spring Aop JDK和CGLIB动态代理调用过程 1.美图 2.概述 3.Spring Aop JDK动态代理调用过程 参考: 4. Spring Aop CGLIB动态代理调用过程 参考: 阅读详情

相关推荐

汇川AM系列后台安全管理与用户权限的设置方法

汇川AM系列后台安全管理与用户权限的设置方法。

viixin的博客 8457

spring动态代理基本原理

spring的AOP中,代理技术是重要的部分,spring的AOP默认采用了动态代理机制。下面模拟一下动态代理机制的实例 假设有个接口UserDAO: package com.gdsyhgxy.dao; import com.gdsyhgxy.model.User; public interface UserDAO {  public void add(User u);

866

lerobot VLA--SmolVLA代码的讲解

2.图像resize至正方形224x224,图像长宽比不变,其他区域用黑色补充,标记为mask=1,若占位图像(摄像头缺失),则 创建全-1像素的占位图像 标记为mask=0,image为[1, 3, 512, 512],img_mask为True,masks列表长度为2,img_masks为2,因为我这里两个相机。文本嵌入:通过embed_language_tokens() 被转换为嵌入表示,lang_emb 是语言的嵌入,包含了语言的语法和语义信息。1.像素值[0,1]->[-1,1]

caokaifa的博客 4068

jdk动态代理源码分析(二)---依赖接口的实现

接上文,为什么JDK的动态代理需要依赖接口的实现呢?先来一段测试代码看看不依赖接口为报什么错。 Hello类不再实现sayHello接口: package com.xiaosong.proxy.demo.service.impl; public class Hello { public void sayHello() { // TODO Auto-generated m...

weixin_30583563的博客 360

ClickHouse的bitmap使用

ClickHouse的bitmap使用 bitmap的基本使用 在CK中bitmap有两种构建方式,在ClickHouse的官网有说明: (1)一个是由聚合函数groupBitmapState构造的, (2)另一个是由Array Object构造的。同时还可以将位图对象转化为数组对象。 bitmap实战 数据和基本数据表准备 创建一张基本表,一个用户表,有多个描述的维度,每个维度由该维度的唯一id。 CREATE TABLE test02(id UInt16, tag1 UInt8, tag2 UInt8,

zg_hover的专栏 5654

Flink CDC 1.18.1 Oracle 数据同步到postgresql

8、修改Flink的配置文件,主要是各种服务的绑定地址,默认为localhost,统统改为0.0.0.0,如:rest.address: 0.0.0.0 #localhost。将flink-sql-connector-oracle-cdc-3.0.1.jar复制到flink-1.18.1/lib目录中。6、下载 flink-connector-jdbc-3.1.1-1.17.jar,postgresql-42.7.3.jar。7、安装postgresql就不说了,相信你已经有了数据库了。

ynzhangyao的专栏 1800

动态代理实现原理

什么是动态代理 首先,动态代理是代理模式的一种实现方式,代理模式除了动态代理还有静态代理,只不过静态代理能够在编译时期确定类的执行对象,而动态代理只有在运行时才能够确定执行对象是谁。代理可以看作是对最终调用目标的一个封装,我们能够通过操作代理对象来调用目标类,这样就可以实现调用者和目标对象的解耦合。 动态代理的应用场景有很多,最常见的就是AOP 的实现、RPC 远程调用、Java 注解对象获取、日志框架、全局性异常处理、事务处理等。 动态代理的实现有很多,但是 JDK 动态代理是很重要的一种,下面..

qq_46494427的博客 2万+

stm32使用TB6600驱动器控制42BYGH型步进电机

stm32使用TB6600驱动器控制42BYGH型步进电机

qq_35653974的博客 9587

Spring的动态代理

当代理对象调用接口方法时,实际执行的是代理类中的对应方法。动态代理是Java语言中的一个重要特性,它允许我们在运行时动态地创建代理对象,而无需在编译时就确定代理对象的类型。在动态代理中,代理对象与目标对象实现了相同的接口,因此代理对象可以完全替代目标对象,执行与目标对象相同的操作。基于接口的动态代理是指代理类和目标对象实现了相同的接口,代理类在实现接口方法时,通过反射机制调用目标对象的对应方法。动态代理是Java语言中一种非常重要的技术,它允许我们在运行时动态地创建代理对象,从而实现对目标对象的代理操作。

weixin_70320260的博客 3316

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

【Proteus仿真】51单片机+DAC0832+LM358放大电路波形发生器

perseverance51博客 5786

[毕设项目-大模型微调]现代文翻译文言文【基于LLaMA3.1-8B微调】

教你基于LLaMA3.1-8B微调如何做到现代文翻译文言文

逐梦苍穹的博客 2296

Spring AOP动态代理CGLIB、JDK的基本原理

AOP是什么? AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。本文会分别对AspectJ和Spring AOP的实现进行分析和介绍。 Spring AOP如何实现的? Spring AOP中的动态代理主

IT-CRUD 276

R语言机器学习:XGBoost线性回归模型的SHAP值

SHAP(SHapley Additive exPlanations)值是一种基于博弈论Shapley值的机器学习模型解释方法,能够解释任何模型的预测结果。其主要用途包括:1)提高模型的可解释性,帮助非技术用户理解模型预测;2)识别对模型预测最重要的特征,辅助特征选择;3)调试模型,发现预测中的异常;4)评估模型公平性,避免偏见。SHAP值的计算方法包括初始化、迭代计算、归一化和解释,常用工具如Python的shap库支持多种计算方式(如TreeSHAP、KernelSHAP等)。本文还提供了基于R语言计算

专注生信领域 3441

Spring中AOP的基本原理--JDK动态代理实现

使用JDK动态代理,使用Proxy类里面的方法创建代理对象 public interface UserDao { public abstract int add(int a , int b); public abstract String update(String id); } public class UserDaoImpl implements UserDao{ @Override public int add(int a, int b) {

weixin_51351637的博客 235

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring源码之AOP(上篇)

AOP作为一种编程范式,弥补OOP很难优雅处理横跨在程序多个模块的公共行为,其将这些行为从业务逻辑中分离,降低了代码的耦合度,使得业务层能专注于业务的实现。其核心概念有切面、连接点、通知、切点、织入。Spring AOP作为AOP的实现框架之一,通过代理模式实现了AOP,其代理对象的创建方式有两种:①JDK动态代理;②CGLIB。其核心组成为Advisor、Advice、Pointcut,通过这三个接口的实现,完成了切面相关概念的抽象,方便了与AspectJ的结合。

qq_26783889的博客 758

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深度解析 Spring 源码:揭秘JDK动态代理的奥秘

在Spring框架中,JDK动态代理是实现AOP(面向切面编程)的核心机制之一。本文将深入解析Spring源码,揭秘JDK动态代理的奥秘,帮助读者理解其工作原理和实现方式。 JDK动态代理利用反射机制,在运行时动态地创建一个符合特定接口的代理类。当调用代理对象的方法时,实际上会调用代理类的invoke方法,由invoke方法来调用目标对象的方法。这种机制使得我们可以在不修改原有代码的情况下,对方法进行增强和扩展。本文将带领读者深入了解Spring中JDK动态代理的实现原理,掌握其核心概念和编程技巧。

忆~遂愿的博客 3358

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【SSM - Spring篇04】AOP面向切面编程 - 代理模式 - jdbc动态代理 -CGLIB动态代理

AOP概念   AOP采取横向抽取机制,即将分散在各个方法中的重复代码提取出来,然后在程序编译或运行阶段,再将这些抽取出来的代码应用到需要执行的地方(一般用于日志记录、性能统计、安全控制、事务处理、异常处理等操作) AOP术语 切面   切面(Aspect)是指封装横切到系统功能(如事务处理)的类。 连接点   连接点(Joinpoint)是指程序运行中的一些时间点,如方法的调用或异常的抛出。 切入点   切入点(Pointcut)是指那些需要处理的连接点。在Spring AOP 中,所有的方法执行都是

Java小皮孩 7696

Spring Aop

1.AOP概念 AOP采用代理的方式实现 1.1 连接点 程序执行的某个特定位置:如类的开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。 1.2 切点 每个程序类有多个连接点,如拥有两个方法的类,如何定位到感兴趣的连接点,AOP通过切点定位特定连接点。 1.3 ...

chumian8751的博客 133

Spring————动态代理、AOP

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

sinat_39119933的博客 854

Spring AOP详解

目录简述 AOP 概念Spring的AOP理解Spring AOP里面的名词解释动态代理基于接口的动态代理基于子类的动态代理使用动态代理对spring进行方法增强基础xml形式的配置说明spring中基于XML的AOP配置步骤切入点表达式的写法代码实现:Spring通知类型说明 – 简述 AOP 概念 AOP:Aspect Oriented Program,面向(方面)切面的编程;Filter(过滤器)也是一种 AOP。AOP 是一种新的方法论,是对传统 OOP(Object-Oriented Progra

星海IT学习之路 744

Spring源码分析之AOP(基础篇)

AOP作为一种编程范式,弥补OOP很难优雅处理横跨在程序多个模块的公共行为,其将这些行为从业务逻辑中分离,降低了代码的耦合度,使得业务层能专注于业务的实现。其核心概念有切面、连接点、通知、切点、织入。Spring AOP作为AOP的实现框架之一,通过代理模式实现了AOP,其代理对象的创建方式有两种:①JDK动态代理;②CGLIB。其核心组成为Advisor、Advice、Pointcut,通过这三个接口的实现,完成了切面相关概念的抽象,方便了与AspectJ的结合。

2301_78976656的博客 1065

Spring-AOP

Spring-AOP AOP 面向切面编程,是spring中最核心的技术之一 你可以将业务模块中横向上公共的部分抽取出来,利用spring-aop在你需要的时候为你自动注入,而不需要修改你的源代码,开发中就可以更加专注于业务的开发。 动态代理和静态代理 静态代理:静态代理需要你手动实现代理类对象。通过和被代理类实现相同的接口的方式,在代理类中调用被代理类的方法,在代理类中编写需要增强的代码。 动态代理:由机器自动的为你生成代理类对象。你只需要定义被代理类对象,被代理类对象实现的接口。 JDK 动态代理

qq_41995896的博客 1904

Spring AOP 源码解析

之前写过 IOC 的源码分析,那篇文章真的有点长,看完需要点耐心。很多读者希望能写一写 Spring AOP 的源码分析文章,这样读者看完 IOC + AOP 也就对 Spring 会有比较深的理解了。今天终于成文了,可能很多读者早就不再等待了,不过主要为了后来者吧。 本文不会像 IOC 源码分析那篇文章一样,很具体地分析每一行 Spring AOP 的源码,目标读者是已经知道 Spring IOC 源码是怎么回事的读者,因为 Spring AOP 终归是依赖于 IOC 容器来管理的。 阅读建议:1、先

赶路人儿 1831

Spring_AOP入门

Spring之AOP入门一、入门前知识储备静态代理反射反射的一般使用步骤1. 获取Class类型的对象2. 获取构造方法并使用Java.lang. reflect包下的Proxy类Java.lang.reflect包下的InvocationHandler接口反射的应用——动态代理Spring的内核之一AOP 一、入门前知识储备 静态代理、反射、反射之动态代理 静态代理 反射 反射的一般使用步骤 1. 获取Class类型的对象 2. 获取构造方法并使用 Java.lang. reflect包下的Proxy类

hxx_xxh的博客 1193

Spring IOC/AOP

Spring AOP的底层实现   Spring AOP 面向切面编程 Aspect Oriented Programming(适用于权限检查,日志记录,性能分析,事务管理,异常管理) 。Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理。 基于JDK的动态代理   JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中 InvocationHandler是一个接口,可以通过实现该接口定

ThreeAspects的博客 432
上一篇: Spring实现数据库读写分离
下一篇: Servlet和JSP学习笔记
psiitoy
博客等级 码龄18年 105粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值