它可以在弹簧容器中自动为合格的Bean创建代理对象,该对象需要与注释结合使用。使用相对简单。让我们看一下案件。
首先在包装中定义2个豆子
用户服务bean
汽车服务豆
通过各个方面定义一个正面通知,您需要拦截上述两个豆的上述所有方法。在执行方法之前,输出一条日志
“”
Factext 1中有4个关键信息
@1:使用@component将此类注册到弹簧容器;
@2:使用@Aspect标记为定义配置类的方面;
@3:定义入口点。当前的配置将拦截Test1软件包的所有方法以及其子袋中的所有类,而汽车服务和用户服务则仅满足,因此它们将被拦截;他们将被拦截;
@4:定义一个前通知,此通知将对@3定义的起点生效;
@5:目标方法执行,输出一行日志;
这是春季配置类
“”
@1:@componentscan注释将在当前软件包中扫描类,将@component的类别注册到弹簧容器中;
@2:@enableaspectjautoproxy是启用自动代理创建的更关键。简单地理解:容器中的Bean和Advisor类型BEAN将转换为顾问收集,Spring将bethrough bethrough顾问设置的顾问,以生成一个符合容器中入口点表达式的代理对象,整个弹簧容器为在弹簧容器开始时自动完成。该原理稍后引入。
让我们测试使用守则,启动弹簧容器,加载配置类并验证
运行输出
允许通过顾问和@方面在春季容器中发出通知。当多个顾问和@方面在春季容器中具有多个顾问和@方面吗?在引入此内容之前,我们需要在AOP中查看四个通知。
所有通知最终都需要转换为一种通知类型,然后形成一个通知。我们称方法呼叫链或拦截器链。
让我们看一下4个通知的使用和执行过程,以促进我们了解其执行顺序。
org.aopalliance.intercept.methodinterceptor:方法拦截器方法拦截器。这相对强大。您可以在执行方法之前和之后执行一些增强的操作。其他类型的通知最终将作为MethodInterceptor执行。
下面我们的习惯
org.springframework.aop.methodbeforeadvice:方法前通知方法前通知,您可以在方法之前定义增强的操作。
下面我们自定义MethodBeforeadVice
MethodBeForeadVice最终将被包装为MethodBeForeadViceInterceptor类型,然后通过MethodBeForeadViceInterceptor代码放置在拦截器链中以执行。
org.springframework.ap.ap.afterreturningadvice:该方法返回通知方法,以返回通知执行该方法后执行一些增强的操作。
下面我们的习惯
AfterReTurningAdvice最终将被包装为AfterReTurningAdviceInterceptor,然后放入Interceptor链中执行,通过AfterUnturningAdturningAdviceIntercteptor代码可以理解AfterReTreturningAdvices的执行过程
org.springframework.aop.throwsadvice:异常通知当目标方法发生异常时,您可以指定需要通过ThrowSadVice调整的方法。我们可以记录一些异常信息或将异常信息发送到监视系统。
在下面我们自定义throwsadvice
ThrowsAdviver最终将作为一个项目包装,然后将其放入插头链中以通过ThrowSadviiiconomical代码执行。
如果目标方法上有几个通知,请调用目标方法执行,Spring将将所有通知转换为列表,然后按顺序执行。第一个拦截器将首先调用,该方法将传递该方法的参数类型,我们可以调用该方法执行第二个拦截器,然后根据此过程按顺序执行。当再次调用最后一个时,将调用目标方法。
![图片]()
结合上述过程,如果又添加了目标方法,则依次添加以下4个通知,让我们分析其执行过程
根据通知,非类型通知将包装成类型。除第一个外,其他三个将被转换为其中。转换后,它变为下面:
根据通知链的执行过程,它最终变成了以下内容:
在下面的目标对象中使用上述4个通知
执行以下代码生成代理,然后通过代理调用SAID方法
被4个拦截器链包裹后,执行过程成为以下
再次简化
最终输出
就案例而言,让我们看一下最终执行结果是否与我们分析相同。以下是需要是代理的类,以及需要使用的4个通知。
相应的测试代码
运行输出
它与上述分析完全相同。
以下5种注释可用于定义通知
当单个定义各种通知时,@enableaspectjautoproxy将内部对其进行排序,订单订单如下
让我们同时定义5个通知,然后逐步分析其执行的属性。
此类中的所有方法将截获下面的源代码。
参加春季配置类,使用标签
测试代码
运行输出如下如下
操,这个输出似乎与我们不同。以上将按以下顺序执行。现在是什么状况?
不用担心,分类规则和输出结果没有问题。听我的缓慢分析。下面的分析非常重要。注意
@Aspemp通过5注射在5中定义通知。这些注释需要转换为建议才能执行。转换关系如下
aop.aspectj.aspectjmethodbeforeadvice专注于桌子右侧的建议类。当您了解这些建议的源代码时,每个人都可以理解执行的顺序。让我们看一下这些类别的源代码。
该界面是无需包装的。
源代码:
实现接口,这是返回通知的方法,而不是类型,因此必须将其包装到类型中,该类型成为一种类型,并成为一种类型。
源代码:
实现了接口,因此执行最终执行时无需打包。
请注意,Invoke方法使用尝试...最后方法。@After方法的调用最终放入,因此,无论是否存在异常,都将执行@After类型的通知。
源代码:
接口已实现,并且执行时不需要包装。
源代码:
实现接口,这是一个前通知,而不是类型,因此有必要将其包装到类型中,并变成一种类型,成为以下类型,并成为一种类型。
在每个人都了解@Aspect的5个通知内容之后,我们回顾了代码中定义的5个通知
我们得出的结论是,它将按以下顺序执行
根据上述顺序,逐步分析。
首先执行第一个通知,如下如下
第二个通知将被执行,并将成为以下通知
继续执行第三个通知,成为以下
继续执行第四通知并成为以下内容
继续执行第五通知并成为以下内容
继续调用目标方法,它变为
替换上述调用目标方法,并将其变为以下
因此最终输出
在春季环境中使用,您可以使用并定义多个通知。当弹簧容器中有多个时,它们的顺序是多少?
让我们看一下如何成为,指定顺序。
注释需要在类别上使用。值越小,通知的优先级就越高。
定制序列是通过接口指定的。该接口具有返回通知顺序的方法。
春季为我们提供了一种抽象类。该课程实现接口。大部分春天将继承。如果您需要自定义,则可以继承此类。
Spring为我们提供了一个默认类:该类是继承的,我们通常可以直接使用定义通知。
1.获取@expact,顾问在弹簧容器中键入所有bean,然后获取列表列表1
2.根据订单的价值对获得结果列表的订单进行排序1
3.然后在list2中的@Aspect类型的bean内部进行通知。
4.最终运行时,您将获得以上排序调用链列表的方法。
在下面,我们定义两个@Aspect类,一个顾问类,并指定这3个,然后验证通知执行的顺序。
首先定义目标类
Factix1:第二个@Aspect
Factix1:第二个@Aspect
定制顾问
来春季配置类标签以启用自动化的AOP函数
测试代码
运行输出
下面的结果我们启动了结果为何以上结果。
获取@expact的所有bean,顾问类型中的弹簧容器,并根据其获得的顺序排序:
然后对每个内部通知进行排序。根据单个内部通知,可以获得订单规则:
让我们逐步进行代码。
首先填写并获取:
执行将调用下一个拦截器,即在介质中定义的拦截器,然后获取以下代码:
执行将调用下一个拦截器,即在介质中定义的拦截器,然后获得类似的拦截器,然后获取以下代码:
此时将继续执行目标方法,然后将其演变为以下
与输出结果进行比较是完全一致的。
该注释有两个参数。让我们看一下下面的评论。它相对简单,因此没有案例演示。
将在弹簧容器中注册豆子
这是一种类型,每个人都应该熟悉它。Bean后处理器可以在Bean声明周期中操作Bean,例如Bean的代理;对于合格的bean,会自动生成代理对象,如果您不谈论它,源代码就在这里,您可以从该方法中查看它,这是相对简单的。
今天,仍然有很多内容,每个人都在消化它。
主要是,当您以方式掌握多个通知的执行顺序时。如果您看一下,它将更容易理解该原理,并且更容易使用。
原始:https://juejin.cn/post/709666653647037471