当前位置: 首页 > 网络应用技术

春季系列@enableaspectjautoproxy中的通知顺序

时间:2023-03-08 23:08:49 网络应用技术

  它可以在弹簧容器中自动为合格的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