Spring AOP可以动态地加载不同类,它可以在运行时动态地更改应用程序的行为。Spring AOP可以在运行时动态地更改应用程序的行为,而不需要重新编译它。Spring AOP可以在运行时动态地更改应用程序的行为,而不需要重新编译它。Spring AOP可以在运行时动态地更改应用程序的行为,而不需要重新编译它。Spring AOP可以在运行时动态地更改应用程序的行为,而不需要重新编译它。Spring AOP可以在运行时动态地更改应用程序的行为,而不需要重新编译它。
Spring AOP可以在运行时动态地更改应用程序的行为,而不需要重新编译它。它可以在运行时动态地更改应用程序的行为,从而提供更多的灵活性。它可以在运行时动态地更改应用程序的行为,从而提供更多的灵活性,可以更好地满足不同的业务需求。它还可以在运行时动态地更改应用程序的行为,从而提供更多的灵活性,可以更好地满足不同的业务需求,并且可以动态地加载不同类,从而更好地满足不同的业务需求。
SpringAOP是利用代理模式,在运行时生成一个目标对象的代理,并且使用代理代替目标对象,整个过程对使用者透明,使用者无法像使用目标对象一样使用代理对象,代理对象类型是目标对象所属类的子类或者接口实现,北京IT培训认为这个子类也是在运行时动态生成,这个生成子类的过程使用 *** 作字节码技术,Spring框架中使用两种字节码技术:JDK动态代理和CGLIB,当目标类实现了接口时使用JDK动态代理,否则使用CGLIB代理。
AOP的实现包含下面几个步骤:
根据配置或注解解析切面。
生成AOP代理对象,给目标对象生成一个代理类以及代理类实例,根据解析出的切面,生成通知链设置到代理对象,在代理的回调中会执行通知链。
把AOP代理对象注册到容器中代替目标对象,当使用者向容器请求目标bean时,容器会返回代理对象。
下面对这几个步骤逐一的分析。
切面解析
在分析切面解析过程之前,首先先了解一下几个关键的接口,看下面的类图。
PointCut:描述切点,在进行切点匹配时,使用ClassFilter进行类匹配,MethodMatcher进行执行方法匹配。
Advice:通知,AfterAdvice后通知,BeforeAdvice前通知,DynamicIntroductionAdvice引用通知,环绕通知通过Interceptor实现。
Advisor:通知器,也就是切面,PointcutAdvisor切点通知器,IntroductionAdvisor引用通知器。
在创建AOP代理之前需要把相关的切面配置解析成上面类图中的接口子类的对象,对于ProxyFactoryBean来说,没有这个过程,因为这种方式下不能使用切点。
切面解析完成之后,把解析出的通知添加通知链中,AOP代理对象引用该通知链执行切面通知逻辑。对于aop标签方式和注解方式添加通知链这个动作的代码是类似的,解析切面这个过程有些差异。
了解springboot aop的动态代理方式有哪些种类?
有3种,前提均开启springaopauto=true:
1 jdk动态代理:当springaopproxy-target-class=false, 引入了aspectjweaver依赖时生效
2 cglib代理:当springaopproxy-target-class=true, 引入了aspectjweaver依赖时生效
3 基础代理:当springaopproxy-target-class=true, 若没有aspectjweaver依赖时生效,只作用于框架内部的advisors,
我们既然用springboot那么就采用springboot的AopAutoConfiguration自动配置类来加载aop机制的,内部对@EnableAspectJAutoProxy进行了封装,扩展了一些配置项,同时还提供了ClassProxyingConfiguration配置(下面会讲到)
这个自动装配类会是spring boot框架自动会装配的,所以说默认aop机制是打开的,可以通过配置项:springaopauto=false 手工关闭。
这个配置类会根据springaopproxy-target-class配置项来决定采用jdk动态代理或者cglib动态代理:
注意:AspectJAutoProxyingConfiguration配置类生效前提是@ConditionalOnClass(Adviceclass),说明只有当引入了依赖项才生效:
而这里推荐使用spring-boot-starter-aop来传递依赖:
这里我们已经看到提供了原生spring的两种代理方式,接着看AopAutoConfiguration源码发现还有个ClassProxyingConfiguration配置类,其生效条件之一是@ConditionalOnMissingClass("orgaspectjweaverAdvice"),就是当项目里没有aspectjweaver的依赖的时候生效。
我们进入AopConfigUtilsregisterAutoProxyCreatorIfNecessary(registry)方法,通过几步调用跳转:
发现会去注册InfrastructureAdvisorAutoProxyCreator后置处理器,查看源码注释:
表明了InfrastructureAdvisorAutoProxyCreator只为基础的advisor做动态代理,而忽略应用定义的Advisors,说明项目中我们自定义的切面是不会被AOP代理的。
原理:sping aop是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP 可以说也是这种目标的一种实现。
其原理的相关技术:
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程。AOP(这里的AOP指的是面向切面编程思想,而不是Spring AOP)主要的的实现技术主要有Spring AOP和AspectJ。
AspectJ的底层技术是静态代理,即用一种AspectJ支持的特定语言编写切面,通过一个命令来编译,生成一个新的代理类,该代理类增强了业务类,这是在编译时增强,相对于下面说的运行时增强,编译时增强的性能更好。
Spring AOP采用的是动态代理,在运行期间对业务方法进行增强,所以不会生成新类,对于动态代理技术,Spring AOP提供了对JDK动态代理的支持以及CGLib的支持。
JDK动态代理只能为接口创建动态代理实例,而不能对类创建动态代理。需要获得被目标类的接口信息(应用Java的反射技术),生成一个实现了代理接口的动态代理类(字节码),再通过反射机制获得动态代理类的构造函数,利用构造函数生成动态代理类的实例对象,在调用具体方法前调用invokeHandler方法来处理。
接口:
用于创建动态代理类的类:
被代理对象的类:
既然用到了动态代理,那么我们来看看Java中23种设计模式之代理设计模式。
Java中代理按照代理类的生成时机,可分为静态代理和动态代理。
静态代理代理类在编译期就生成,而动态代理代理类则是在运行时动态生成。动态代理又有JDK代理和CGLib代理两种。
JDK动态代理要求必须定义接口,对接口进行代理。
CGLIB是第三方提供的包,所以需要引入jar包
代理是使用非常广泛的设计模式。简单来说,代理是一个看其他像另一个对象的对象,但它添加了一些特殊的功能。
Spring AOP是基于代理实现的。AOP 代理是一个由 AOP 框架创建的用于在运行时实现切面协议的对象。
Spring AOP默认为 AOP 代理使用标准的 JDK 动态代理。这使得任何接口(或者接口的集合)可以被代理。Spring AOP 也可以使用 CGLIB 代理。这对代理类而不是接口是必须的。
如果业务对象没有实现任何接口那么默认使用CGLIB。
在初始化容器的最后,会创建业务bean。创建bean的流程与BeanPostProcessor的创建流程一样( Spring注解--AOP原理(三):BeanPostProcessor创建与注册 )。只是由于在此之前BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)已经注入到容器中,于是在创建业务bean的时候,就可以利用该后置处理器的postProcessAfterInitialization方法中的wrapIfNecessary方法来创建代理对象,进而可以对业务对象进行拦截。请参考 Spring注解--AOP原理(二):AnnotationAwareAspectJAutoProxyCreator
如果业务bean有代理对象,则返回代理对象;否则返回业务bean本身。
最后进入 DefaultAopProxyFactory 类,创建代理对象
最后将代理bean注入到容器中。
以上就是关于springaop动态加载不同类全部的内容,包括:springaop动态加载不同类、北京IT培训分享动态SpringAOP的是如何实现的、2020-07-26 带着疑问看源码 -- springboot aop默认采用什么动态代理机制等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)