热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springAOP(一)动态代理

说明:图片是我其它地方博客里的packagedproxy;***抽象主题**interfaceSubject{voidsubjectMethod(inta,intb);}*

图片描述

图片描述

说明:图片是我其它地方博客里的

package dproxy;/**
*抽象主题
**/
interface Subject {void subjectMethod(int a,int b);
}/**
*具体主题
**//**
*实现了Subject接口,并且覆盖了subjectMethod方法
**/
package dproxy;public class RealSubject implements Subject {//Joinpoint连接点@Overridepublic void subjectMethod(int a, int b) {// TODO Auto-generated method stubSystem.out.println(a+"+"+b +"="+(a+b));}}/**
*代理处理
**/
package dproxy;
import java.lang.reflect.InvocationHandler;//Aspect(方面)???
public class ProxyHandler implements InvocationHandler {private Object subject;public ProxyHandler(Object subject) {// TODO Auto-generated constructor stubthis.subject = subject;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {before();// TODO Auto-generated method stubSystem.out.println("调用真实主题的方法");
/**
*用反射机制调用了realMethod方法
**/method.invoke(subject, args);after();return null;}//Advice(通知)public void before() {System.out.println("代理前的处理操作"); }//Advice(通知)public void after() {System.out.println("代理后的处理操作"); }}

invoke方法参数说明: invoke方法的第一个参数是 proxyProxy.newProxyInstance 创建的对象,我在网上看到很多文章说这个参数是被代理类的对象即RealSubject的对象,这种说法是错误的,大家可以用RTTIproxy进行了解,它确实是 Proxy.newProxyInstance 创建的对象
构造器说明: ProxyHandler() 构造器接受一个参数,这个参数是被代理类即RealSubject的对象。
invoke内部解析: 我们在 invoke 函数里面 通过 method.invoke(subject, args); 调用了真实主题,即被代理对象的某一个方法,注意 invoke的第二个参数是 method 它指明调用被代理对象的哪一个方法,第三个参数是该方法的参数。

package dproxy;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class Client {public static void main(String[] args) {// TODO Auto-generated method stub
/**
*创建真实主题
**/Subject realSubject = new RealSubject();
/**
*创建代理处理器
**/ProxyHandler handler = new ProxyHandler(realSubject);
/**
*创建代理对象
**/Subject proxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(),handler);
/**
*调用动态创建的代理对象的动态生成的subjectMethod方法
**/proxy.subjectMethod(3, 5); //执行了3+5操作 并在该操作前后调用了附加方法}}

说明1:Proxy.newProxyInstance创建了一个代理对象,并且以Subject的身份去调用一个貌似和Subject类一模一样的接口subjectMethod由于 proxy对象是Subject类型的 即 Subject proxy ,所以我们执行 proxy.subjectMethod(3, 5);时感觉不到在用代理。
说明2:我们创建proxy时传入了一个handler对象。在这个对象里我们调用了被代理的那个对象的方法,并且在其前后附加了方法。

执行流程:

1Client 创建了一个被代理的对象 realSubject
2 创建了一个代理处理器,这里是代理处理器,并不是代理类,因为它不是Subject类型,也没有和Subject内部长的一样的函数所以它不是代理对象,但是它对真实对象,即realSubject 对象的调用时由这个对象代替代理类来做的。也就是代理类将对被代理对象的调用的职责委托给了这个代理处理器
3 Proxy 类创建了一个对象,然后这个类通过 java反射机制 将创建的这个对象变的类型变成了Subject,创建的这个对象内部有一个代理处理器对象handler
4 由3创建的那个代理对象,执行proxy.subjectMethod(3, 5);Subject的身份调用了一个和Subject接口中的某个函数长的一样的一个函数,这是因为proxySubject类型的一个对象
5 proxysubjectMethod函数内部将对被代理对象的调用委托给了代理处理器对象handler

spring AOP 的关系
AOP 中的 Advice通知 就是我们在被代理方法执行前后附加的方法
AOP 中的 Joinpoint连接点 就是我们需要执行的那个 3+5的方法
AOP 中的 Aspect方面 如果我们将所有的 Advice通知 提取出来放在 一个类中就构成 了 Aspect方面
AOP 中的 Pointcut切入点 是所有符合相同规则的连接点的集合,例如所有以do开头的方法,切入点内包含一套规则用来说明该切入点包含哪些链接点
AOP 中的Introduction(引介) 引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field
AOP 中的Target(目标对象) 代理的目标对象(要增强的类)
AOP 中的织入 Weaving把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。织入可以在对象生命周期的编译期、类加载期、运行期完成。Spring AOP 因为采用动态代理,所以是在 运行期 完成织入。
AOP 中的Proxy(代理) 一个类被AOP织入增强后,就产生一个结果代理类



推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
手机用户2502898783
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有