vue3之语法糖script setup的父子组件、兄弟组件传值


AOP使用起来非常简单,底层代码量也不算很多

一、如何使用AOP?

我们只需要新建一个类(切面类),为她增加AOP切面注解@Aspect就可以使用了,在里面定义一些“增强方法”,然后通过@Before、@After、@AfterReturning、@AfterThrowing、@Round注解来指定何时执行方法的增强,分别表示在方法之前、在方法之后、在方法正常返回后、在方法异常返回后、对方法进行包裹。
注意:@After=@AfterReturning+@AfterThrowing
例如:
在这里插入图片描述
在这5个注解中使用execution表达式进行增强范围的限定,可以精确到某个类的某个方法
在这里插入图片描述
写了这几个简单的注解之后AOP就可以生效了
运行原本的Bean方法,就会在方法执行之后出发我们编写的增强方法了
在这里插入图片描述

二、在Spring中AOP具体如何运行?

在Spring启动时,会创建IOC容器同时将Spring内的bean进行三个连续的动作:构造、填充属性、初始化。
“AOP功能”就是通过Spring内一个专门处理AOP的:“bean后置处理器”DefaultAdvisorAutoProxyCreator进行方法增强的,可以算作IOC的附加功能
所有的后置处理器都在bean构造完并且填充了属性之后执行,这当然也包括AOP后置处理器
在每一个bean初始化之后都会调用这个后置处理器的postProcessorAfterInitialization方法
在这里插入图片描述
在这个方法里会为需要使用AOP的bean创建代理对象,先通过getAdvicesAndAdvisorsForBean方法获取所有的增强Advice

同时判断当前bean是否满足我们配置的切面条件,如果满足条件的话就会为这个bean构造代理对象来实现AOP。
在这里插入图片描述
为了更统一、更方便地构造代理对象,会先搭建一个专门用来构造生产代理对象的工厂proxyFactory,然后会告诉这个工厂具体选择哪种方式进行代理,分别是cglib和jdkProxy。我们可以通过添加@EnableAspectJAutoProxy注解并且将其中proxyTargetClass配置改为true来强制使用cglib(不过在springboot中就是默认使用cglib)。不过只有这个配置为false同时该类实现了任意接口才会使用jdkProxy否则还是会使用cglib。
proxyFactory知道使用哪种方式之后就会构造JdkDynamicAopProxy或者CglibAopProxy,然后就可以通过它们的getProxy方法获得真正的代理对象
在这里插入图片描述

1.先介绍JdkDynamicAopProxy,

在getProxy中会构造一个实现同样bean接口的代理对象,将真实bean作为代理对象中的一个成员变量。在调用bean方法的时候就会执行代理对象中的invoke方法,这个invoke方法只有两步:
①通过之前提到的execution表达式获取所有与该方法匹配的所有增强方法,并将它们组成调用链同时进行排序
②就是开始按顺序执行这些调用链,这里的调用方式就是经典的责任链模式,在调用中间会插入并执行bean真实的方法

2.然后是最常用的CglibAopProxy,

同样在getProxy中会构造代理对象,用增强器Enhancer来设置代理基本信息以及增强方法的调用链(最后生成.class文件),接着执行enhancer的create方法来生成代理对象

和JdkDynamicAopProxy不同的是Cglib是基于jdk rt jar包中的ASM来生成一组新的.class文件,然后实例化它的对象。所以对于没有实现接口的bean也可以生成代理对象,在调用bean方法的时候会先执行代理对象的intercept方法,
与JdkDynamicAopProxy一样也会通过责任链来执行所有的方法增强

猜你喜欢

转载自blog.csdn.net/sinat_38297809/article/details/124965826