关于spring-aop:Spring-AOP-动态代理

本文剖析Spring AOP和动静代理原理和实现,Spring版本: 5.2.3.RELEASE 动静代理1.1 代理模式代理模式也叫做委托模式,它是一种根本的设计模式,其作用是提供委派角色以管制对实在对象的拜访。典型的代理模式通常蕴含一下三类角色 形象角色:它的作用是定义一组行为规范。形象角色个别出现为接口或抽象类实在角色:也叫做被委托角色、被代理角色代理角色:也叫做委托类,代理角色须要实现形象角色所定义的行为(即代理类须要实现形象角色所定义的接口),并且在实现接口办法的时候须要调用实在角色的相应办法动态代理类依赖于实在类,对每一个实在类作代理都须要对应一个代理类,动态代理大量应用会导致类的急剧收缩,区别于动态代理在编译期确定代理类和实在类的关系并且生成代理类。动静代理则是在运行期利用JVM的反射机制生成代理类的字节码,并通过类加载器载入执生成代理对象 1.2 JDK动静代理JDK动静代理是在运行时借助Proxy工具类静态方法创立实现了一组特定接口的代理类和对象,Proxy类是所有被创立的动静代理类的父类,每一个动静代理对象都会与特定的InvocationHandler对象绑定,对任意代理对象实现的接口办法的调用都会最终委派给InvocationHandler#invoke办法 // 定义形象角色接口public interface Subject { void sayHello(String name);}// 接口实现public class RealSubject implements Subject { @Override public void sayHello(String name){ System.out.println("hello, "+ name); }}// 编写调用解决类,实现invoke办法(加强逻辑的入口)public class MyInvocationHandler implements InvocationHandler { private Subject subject; MyInvocationHandler(Subject subject){ this.subject = subject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ //前置解决 System.out.println("Before method invoke..."); Object obj = method.invoke(subject, args); //后置解决 System.out.println("After method invoke..."); return obj; }}// 测试方法public class Client{ public static void main(String[] args) { Subject realSubject = new RealSubject(); MyInvocationHandler handler = new MyInvocationHandler(realSubject); Subject proxy = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler); proxy.sayHello("world"); }运行后果:Before method invoke...hello, worldAfter method invoke...从运行后果能够看出,对代理对象办法的调用会进入到自定义MyInvocationHandler#invoke办法,并在指标办法执行前后打印出了日志。将Proxy类生成的代理类通过反编译失去如下类文件,能够看到RealSubjectProxy继承自Proxy且实现了Subject接口,它定义了4个办法m0,m1,m2,m3,其中办法m3是对Subject接口sayHello办法的实现 ...

July 7, 2023 · 12 min · jiezi

关于spring-aop:被面试官问烂的Spring-AOP原理你是怎么答的

Spring AOP在Spring体系中深不可测,Spring AOP原理也是常常在互联网大厂面试时被问到,明天,我给大家抽丝剥茧,具体到你无奈设想。我划分为四个阶段给大家介绍:创立代理对象阶段、拦挡指标对象阶段、调用代理对象阶段、调用指标对象阶段。 我整顿了一张残缺的Spring AOP设计原理UML图,须要高清图的小伙伴能够私信我。 上面具体介绍每个阶段的执行细节。 1、第一阶段:创立代理对象阶段在Spring中,创立Bean实例都是从getBean()办法开始的(呈现getBean()动画),在实例创立之后,Spring容器将依据AOP的配置去匹配指标类的类名,看指标类的类名是否满足切面规定。如果满足满足切面规定,就会调用ProxyFactory创立代理Bean并缓存到IoC容器中。(呈现调用ProxyFactory创立代理Bean动画)依据指标对象的主动抉择不同的代理策略。(呈现抉择代理策略动画)如果指标类实现了接口,Spring会默认抉择JDK Proxy,如果指标类没有实现接口,Spring会默认抉择Cglib Proxy,当然,咱们也能够通过配置强制应用Cglib Proxy。 2、第二阶段:拦挡指标对象阶段当用户调用指标对象的某个办法时,(呈现AopProxy对象拦挡)将会被一个叫做AopProxy的对象拦挡,Spring将所有的调用策略封装到了这个对象中,它默认实现了InvocationHandler接口,也就是调用代理对象的外层拦截器。(呈现调用InvocationHandler的invoke()办法动画)在这个接口的invoke()办法中,(呈现触发MethodInvocation的proceed()办法动画)会触发MethodInvocation的proceed()办法。在这个办法中会按程序执行合乎所有AOP拦挡规定的拦截器链。 3、第三阶段:调用代理对象阶段Spring AOP拦截器链中的每个元素被命名为MethodInterceptor,(呈现反射调用Advice对象动画)其实就是切面配置中的Advice告诉。这个回调告诉能够简略地了解为是新生成的代理Bean中的办法。(呈现执行织入代码动画)也就是咱们常说的被织入的代码片段,这些被织入的代码片段会在这个阶段执行。 4、第四阶段:调用指标对象阶段MethodInterceptor接口也有一个invoke()办法,(呈现执行MethodInterceptor的invoke()办法动画)在MethodInterceptor的invoke()办法中会触发对指标对象办法的调用,也就是反射调用指标对象的办法。(呈现调用指标对象动画) Spring AOP原理就剖析到这里,最初,总结一下不迷路:(呈现代理对象动画)1、代理对象:就是由Spring代理策略生成的对象;(呈现指标对象动画)2、指标对象:就是咱们本人写的业务代码;(呈现织入代码动画)3、织入代码:就是要在咱们本人写的业务代码减少的代码片段;(呈现切面告诉动画)4、切面告诉:就是封装织入代码片段的回调办法;(呈现MethodInvocation动画)5、MethodInvocation:负责执行拦截器链,在proceed()办法中执行;(呈现MethodInterceptor动画)6、MethodInterceptor:负责执行织入的代码片段,在invoke()办法中执行。 都看到这里了,你还感觉Spirng AOP原理难吗?我再送给大家一张精简版的Spring AOP执行流程图,须要的小伙伴立马关注点个赞。 如果本文对您有帮忙,欢送关注和点赞;如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源。关注微信公众号『 Tom弹架构 』可获取更多技术干货! 往期视频曾经整顿成文档模式,须要的小伙伴点个关注,增加下方名片!

April 22, 2022 · 1 min · jiezi

关于spring-aop:阿里大牛亲码-Spring-AOP详解笔记全网开源学透并发只需3天

Hello,明天给各位童鞋们分享Spring AOP,连忙拿出小本子记下来吧! 概述AOP是aspect-oriented programming的缩写,译为面向切面编程。利用 AOP 能够对业务逻辑的各个局部进行隔离,从而使得 业务逻辑各局部之间的耦合度升高,进步程序的可重用性,同时进步了开发的效率。简略来说,AOP就是不批改源代码在骨干性能外面增加新性能。 底层原理AOP底层应用了动静代理:在有接口的时候应用JDK 动静代理、在没有接口的时候应用CGLIB字节码动静代理。 JDK动静代理简介 应用JDK 动静代理须要用到JDK中的Proxy类外面的newProxyInstance办法创立代理对象。办法如下: static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h); newProxyInstance办法的三个参数阐明: loader 定义代理类的类加载器 interfaces 代理类要实现的接口列表(能够多个) h 指派办法调用的处理程序(要加强的性能在这外面实现) newProxyInstance办法返回一个指定接口的代理类实例。 InvocationHandler接口中有个invoke办法,用于实现加强的性能: public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;invoke办法的三个参数阐明: proxy示意代理对象 method示意被加强的办法 args是办法的参数 若没有则为null 示例代码代码构造如下: └─src └─com └─spring5 JDKProxy.java UserDao.java UserDaoImpl.javaUserDao接口: public interface UserDao { int add(int a,int b); String update(String id);} UserDaoImpl类: JDKProxy类: 运行后果: 办法之前执行…add :传递的参数…[1, 2] I am add… ...

May 10, 2021 · 2 min · jiezi

关于spring-aop:Spring-AOP

Spring AOP次要内容代理模式 代理模式在 Java 开发中是一种比拟常见的设计模式。设计目的旨在为服务类与客户类之间插入其余性能,插入的性能对于调用者是通明的,起到假装管制的作用。如租房的例子:房客、中介、房东。对应于代理模式中即:客户类、代理类 、委托类(被代理类)。 为某一个对象(委托类)提供一个代理(代理类),用来管制对这个对象的拜访。委托类和代理类有一个独特的父类或父接口。代理类会对申请做预处理、过滤,将申请调配给指定对象。 生存中常见的代理状况: 租房中介、婚庆公司等 代理模式的两个设计准则: 1. 代理类 与 委托类 具备类似的行为(独特) 2. 代理类加强委托类的行为 罕用的代理模式: 1. 动态代理 2. 动静代理 动态代理 某个对象提供一个代理,代理角色固定,以管制对这个对象的拜访。 代理类和委托类有独特的父类或父接口,这样在任何应用委托类对象的中央都能够用代理对象代替。代理类负责申请的预处理、过滤、将申请分派给委托类解决、以及委托类执行完申请后的后续解决。 代理的三要素 a、有独特的行为(结婚) - 接口 b、指标角色(新人) - 实现行为 c、代理角色(婚庆公司) - 实现行为 加强指标对象行为 动态代理的特点 1、指标角色固定 2、在应用程序执行前就失去指标角色 3、代理对象会加强指标对象的行为 4、有可能存在多个代理 引起"类爆炸"(毛病) 动态代理的实现定义行为(独特) 定义接口/** * 定义行为 */public interface Marry { public void toMarry();} 指标对象(实现行为)/** * 动态代理 ——> 指标对象 */public class You implements Marry { // 实现行为 @Override public void toMarry() { System.out.println("我要结婚了..."); }} 代理对象(实现行为、加强指标对象的行为)/** * 动态代理 ——> 代理对象 */public class MarryCompanyProxy implements Marry { // 指标对象 private Marry marry; // 通过结构器将指标对象传入 public MarryCompanyProxy(Marry marry) { this.marry = marry; } // 实现行为 @Override public void toMarry() { // 加强行为 before(); // 执行指标对象中的办法 marry.toMarry(); // 加强行为 after(); } /** * 加强行为 */ private void after() { System.out.println("新婚高兴,早生贵子!"); } /** * 加强行为 */ private void before() { System.out.println("场地正在安排中..."); }} 通过代理对象实现目标对象的性能// 指标对象You you = new You();// 结构代理角色同时传入实在角色MarryCompanyProxy marryCompanyProxy = new MarryCompanyProxy(you);// 通过代理对象调用指标对象中的办法marryCompanyProxy.toMarry(); 动态代理对于代理的角色是固定的,如dao层有20个dao类,如果要对办法的拜访权限进行代理,此时须要创立20个动态代理角色,引起类爆炸,无奈满足生产上的须要,于是就催生了动静代理的思维。 ...

December 2, 2020 · 5 min · jiezi