Spring AOP:隐秘的秘密

摘要

Spring AOP 是开发中的关键角色,但有些细节易被忽略。同一类中多个横切面注释的执行顺序:@Around [proceed()前] -> @Before -> @Around [proceed()后]。

正文

Spring AOP 在大家日常开发设计中饰演了一个十分关键的人物角色,针对怎么使用 AOP 坚信很多人早已不生疏,但在其中有一些点却非常容易被大家忽略,这节大家融合一些“不以常知”的难题深入探讨。

同一个 AOP 类中好多个横切面注释的实行次序

先得出结果:@Around [joinPoint.proceed()前] —> @Before —> @Around [joinPoint.proceed()及其以后] —> @After —> @AfterReturning(如果有出现异常则@AfterThrowing)

话不多说,我这们立即上编码:

@Aspect
public class AopClass {

    @Pointcut(value = "execution(* io.alan.*.Klass.*dong(..))")
    public void point() {

    }

    @Before(value = "point()")
    public void before() {
        System.out.println("========>begin klass dong... //2");
    }

    @Around("point()")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("========>around begin klass dong //1");
        joinPoint.proceed();
        System.out.println("========>around after klass dong //3");
    }
    @After(value = "point()")
    public void after() {
        System.out.println("========>after klass dong... //4");
    }
    @AfterReturning(value = "point()")
    public void afterReturning() {
        System.out.println("========>after klass dong... //5");
    }

}

查询运用打印出的日志,以下:

image

不一样 AOP 类横切面的实行次序

如果我们对同一个方式界定好几个 AOP,它的实行次序是哪些的呢?

配备 AOP 实行次序的三种方法

方法1:完成 org.springframework.core.Ordered 插口
@Aspect
public class AopClass implements Ordered {

    @Override
    public int getOrder() {
        return 2;
    }

}
方法2:应用注释 @Order
@Aspect
@Order(2)
public class AopClass {

}
方法3:应用环境变量
<aop:config expose-proxy="true">
	<aop:aspect ref="aopBean" order="2">  
		<aop:pointcut   expression="@annotation(xxx.xxx.xxx.annotation.xxx)"/>  
   		<aop:around pointcut-ref="testPointcut" method="doAround" />  
        </aop:aspect>  
</aop:config>

编码检测

下边大家演试在同一份编码上再加上2个 AOP,随后观查日志。

@Aspect
@Order(2)
public class Aop2 {

    @Pointcut(value = "execution(* io.kimmking.*.Klass.*dong(..))")
    public void point() {

    }

    @Before(value = "point()")
    public void before() {
        System.out.println("    Aop2========>before klass dong... //2");
    }

    @AfterReturning(value = "point()")
    public void afterReturning() {
        System.out.println("    Aop2========>afterReturning klass dong... //5");
    }

    @After(value = "point()")
    public void after() {
        System.out.println("    Aop2========>after klass dong... //4");
    }

    @Around("point()")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("    Aop2========>around before klass dong //1");
        joinPoint.proceed();
        System.out.println("    Aop2========>around after klass dong //3");

    }

}
@Aspect
@Order(3)
public class Aop3 {

    @Pointcut(value = "execution(* io.kimmking.*.Klass.*dong(..))")
    public void point() {

    }

    @Before(value = "point()")
    public void before() {
        System.out.println("    Aop3========>before klass dong... //2");
    }

    @AfterReturning(value = "point()")
    public void afterReturning() {
        System.out.println("    Aop3========>afterReturning klass dong... //5");
    }

    @After(value = "point()")
    public void after() {
        System.out.println("    Aop3========>after klass dong... //4");
    }

    @Around("point()")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("    Aop3========>around before klass dong //1");
        joinPoint.proceed();
        System.out.println("    Aop3========>around after klass dong //3");

    }

}

打印出的日志以下:

image

从日志中我们可以见到,order 越小的 AOP 类越先实行,但也有一点必须 大家留意:便是最开始实行的 AOP 最终才实行完毕(如上图所述中的 AOP2)。

大家根据下边的这张平面图就可以了解了。

image

总结一下:我们可以将 Spring AOP 作为一个内切圆,要实行的方式为圆心点,最表层的 order 最少。从最表层依照 AOP1、AOP2 的次序先后实行 Around 方式,Before 方式。随后实行 method 方式,最终依照 AOP2、AOP1 (次序相反了)的次序先后实行 After、AfterReturn 方式。

因此对好几个AOP而言,先实行 before 的,一定后实行 after。

比如,假如我们要在同一个方式事务管理递交后实行自身的 AOP ,那麼能够 把事务管理的 AOP order 设定为2,自身的 AOP order 设定为1,随后在 AfterReturn 里面解决自身的领域模型。

参照连接

  • https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core
  • https://blog.csdn.net/rainbow702/article/details/52185827

END
【About】您好,我是小尹,九零后发展思索实践者。
微信公众号:小尹探世界(內容沧蓝技术性以外)潜心长期主义,创造财富,陪着你一起提升自我,探索宇宙。
欢迎您一起添加一同向前的团队。

关注不迷路

扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!

温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
文章版权声明 1、本网站名称:宇凡盒子
2、本站文章未经许可,禁止转载!
3、如果文章内容介绍中无特别注明,本网站压缩包解压需要密码统一是:yufanbox.com
4、本站仅供资源信息交流学习,不保证资源的可用及完整性,不提供安装使用及技术服务。点此了解
5、如果您发现本站分享的资源侵犯了您的权益,请及时通知我们,我们会在接到通知后及时处理!提交入口
0

评论0

请先

站点公告

🚀 【宇凡盒子】全网资源库转储中心

👉 注册即送VIP权限👈

👻 全站资源免费下载✅,欢迎注册!

记得 【收藏】+【关注】 谢谢!~~~

立即注册
没有账号?注册  忘记密码?

社交账号快速登录