广告
返回顶部
首页 > 资讯 > 精选 >Spring AOP与代理类的执行顺序是什么
  • 643
分享到

Spring AOP与代理类的执行顺序是什么

2023-07-05 16:07:57 643人浏览 泡泡鱼
摘要

本篇内容介绍了“spring aop与代理类的执行顺序是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!关于 Spring AO

本篇内容介绍了“spring aop与代理类的执行顺序是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

关于 Spring AOP和Aspectj的关系,两个都实现了切面编程,Spring AOP更多地是为了Spring框架本身服务的,而Aspectj具有更强大、更完善的切面功能,我们在写业务时一般使用AspectJ。不过他们的概念、原理都差不多。

Spring AOP说:

the Spring Framework’s AOP functionality is nORMally used in conjunction with the Spring ioc container. Aspects are configured using normal bean definition syntax (although this allows powerful “autoproxying” capabilities): this is a crucial difference from other AOP implementations. There are some things you cannot do easily or efficiently with Spring AOP, such as advise very fine-grained objects (such as domain objects typically): AspectJ is the best choice in such cases. However, our experience is that Spring AOP provides an excellent solution to most problems in enterprise Java applications that are amenable to AOP

Spring AOP currently supports only method execution join points (advising the execution of methods on Spring beans). Field interception is not implemented, although support for field interception could be added without breaking the core Spring AOP apis. If you need to advise field access and update join points, consider a language such as AspectJ.

Spring AOP will never strive to compete with AspectJ to provide a comprehensive AOP solution

可参考 Spring AOP vs AspectJ

AspectJ项目中提供了@AspecJ注解,Spring interprets the same annotations @Aspect as AspectJ 5

Spring AOP提供了定义切面的两种方式

  • schema-based approach : XML-based format 通常不用了

  • @AspectJ annotation style:注解形式,起这个名字是因为借鉴了AspectJ项目,其实用的Spring AOP的注解是@Aspect没有J

注解案例:

@Aspect@Component public class NotVeryUsefulAspect {@Pointcut("execution(* transfer(..))")// the pointcut expressionprivate void anyOldTransfer() {}// the pointcut signature@Before("execution(* com.xyz.myapp.dao.*.*(..))")    public void doAccessCheck() {        // ...    } @AfterReturning(        pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",        returning="retVal")    public void doAccessCheck(Object retVal) {        // ...    }@AfterThrowing(        pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",        throwing="ex")    public void doRecoveryActions(DataAccessException ex) {        // ...    }@After("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")    public void doReleaseLock() {        // ...    }@Around("com.xyz.myapp.SystemArchitecture.businessService()")    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {        // start stopwatch        Object retVal = pjp.proceed();        // stop stopwatch        return retVal;    }}

AOP概念

  • Aspect:cut cross multiple classes. Spring AOP通过 schema-based approach 或 @AspectJ annotation style 两种方式定义切面。

  • Join Point:程序执行点,通常代表一个方法的执行。

  • Advice:Aspect中针对不同Join Point执行的操作,包括 around before after 三种advice。很多AOP框架将advice建模成interceptor,在Join Point外层维护一个 chain of interceptors。

  • Pointcut:匹配 Join Points的规则,如@PointCut("pointcut expression"),满足point expression的将进行切面。

  • Target object:被切面的对象。

  • AOP proxy:代理,Spring Framework通常使用jdk 动态代理或CGLIB动态代理。

  • Weaving:linking aspects with other application types or objects to create an advised object. 发生在编译、加载或运行时。

Type of advice

  • before : @Before

  • after returning : @AfterReturning

  • after throwing : @AfterThrowing

  • after (finally) : @After

  • around : @Around

Spring AOP与代理类的执行顺序是什么

代理顺序

当一个target object有多个Spring AOP代理时,代理类执行的顺序有时很重要,比如分布式代理和事务代理的顺序,分布式锁必须包裹住事务。

先下结论:

Spring通过接口或注解来判断代理的顺序,顺序级别越低,代理越靠内层。顺序级别获取步骤如下:

  • 是否实现org.springframework.core.Ordered接口

  • 是否注解了org.springframework.core.annotation.Order注解

  • 是否注解了javax.annotation.Priority注解

  • 如果都没有,默认最低优先级LOWEST_PRECEDENCE = Integer.MAX_VALUE,如@Transanctional注解就是最低级别

优先级定义范围在Integer.MIN_VALUEInteger.MAX_VALUE(参见Orderd接口)。越小,优先级越高,越在外层先执行。

注解方式生成代理类是通过BeanPostProcessor实现的,由AspectJAwareAdvisorAutoProxyCreator完成,该类实现了BeanPostProcessor

注意到该类有一个Comparator类字段。最终优先级由AnnotationAwareOrderComparator来判断:

public class AnnotationAwareOrderComparator extends OrderComparator {public static final AnnotationAwareOrderComparator INSTANCE = new AnnotationAwareOrderComparator();@Override@Nullableprotected Integer findOrder(Object obj) {// 父类,判断是否实现了Orderd接口// (obj instanceof Ordered ? ((Ordered) obj).getOrder() : null)Integer order = super.findOrder(obj);if (order != null) {return order;}// 没有实现则继续搜寻@Order和@Priority注解// 如果返回null,表示找不到,会返回父类执行getOrder方法返回Ordered.LOWEST_PRECEDENCEreturn findOrderFromAnnotation(obj);}@Nullableprivate Integer findOrderFromAnnotation(Object obj) {...// 找@Order和@Priority注解Integer order = OrderUtils.getOrderFromAnnotations(element, annotations);// 如果该类没有注解,递归找被代理类if (order == null && obj instanceof DecoratingProxy) {return findOrderFromAnnotation(((DecoratingProxy) obj).getDecoratedClass());}// 被代理类有则返回优先级,没有则返回nullreturn order;}}

“Spring AOP与代理类的执行顺序是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Spring AOP与代理类的执行顺序是什么

本文链接: https://www.lsjlt.com/news/353530.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring AOP与代理类的执行顺序是什么
    本篇内容介绍了“Spring AOP与代理类的执行顺序是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!关于 Spring AO...
    99+
    2023-07-05
  • Spring AOP的执行顺序是怎样的
    本篇内容介绍了“Spring AOP的执行顺序是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题描...
    99+
    2022-10-19
  • 深入理解Spring Aop的执行顺序
    首先回忆一下 AOP 的常用注解 @Before:前置通知:目标方法之前执行 @After:后置通知:目标方法之后执行 @AfterReturning:返回...
    99+
    2022-11-12
  • Spring初始化与销毁的执行顺序是什么
    这篇文章主要介绍了Spring初始化与销毁的执行顺序是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring初始化与销毁的执行顺序是什么文章都会有所收获,下面我们一起来看看吧。演示 - 初始化销毁顺序@...
    99+
    2023-07-05
  • spring中aop的执行原理是什么
    在Spring中,AOP(面向切面编程)的执行原理主要涉及以下几个方面:1. 切面的定义:通过注解或配置文件等方式,定义切面(Asp...
    99+
    2023-08-09
    spring aop
  • Spring AOP中多切面运行顺序是什么
    这篇文章将为大家详细讲解有关Spring AOP中多切面运行顺序是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Spring AOP多切面运行顺序多切面运行顺序当一个方法的执行被多个切面共同...
    99+
    2023-06-29
  • java代码块的执行顺序是什么
    Java代码块的执行顺序如下: 静态代码块:静态代码块在类加载时执行,并且只执行一次。它用来初始化静态变量或执行一些只需执行一次...
    99+
    2023-10-24
    java
  • C#类中方法的执行顺序是什么
    有些中级开发小伙伴还是搞不太明白在继承父类以及不同场景实例化的情况下,父类和子类的各种方法的执行顺序到底是什么,下面通过场景的举例来重新认识下方法的执行顺序: (下面内容涉及到了C#...
    99+
    2022-11-12
  • mysql的执行顺序是什么
    mysql的执行顺序是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、执行顺序根据查询指定的表格,from计算笛卡尔积。on根据join_condition过滤数据。...
    99+
    2023-06-14
  • java中代码块的执行顺序是什么
    java中代码块的执行顺序是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java...
    99+
    2023-06-14
  • spring初始化方法的执行顺序及其原理是什么
    这篇文章主要讲解了“spring初始化方法的执行顺序及其原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring初始化方法的执行顺序及其原理是什么”吧!Spring中初始化方法的...
    99+
    2023-06-29
  • C#类中方法执行顺序指的是什么
    小编给大家分享一下C#类中方法执行顺序指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!有些中级开发小伙伴还是搞不太明白在继承父类以及不同场景实例化的情况下...
    99+
    2023-06-15
  • golang defer的执行顺序是什么
    在Go语言中,defer语句用于注册延迟调用,延迟调用会在函数执行完毕后被执行,无论函数是正常返回还是发生异常。 当有多个defer...
    99+
    2023-10-22
    golang
  • Java监听器ActionListener与MouseListener的执行顺序是什么
    这篇文章主要介绍“Java监听器ActionListener与MouseListener的执行顺序是什么”,在日常操作中,相信很多人在Java监听器ActionListener与MouseListener的执行顺序是什么问题上存在疑惑,小编...
    99+
    2023-06-21
  • SQL查询的执行顺序是什么
    本篇内容主要讲解“SQL查询的执行顺序是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL查询的执行顺序是什么”吧!很多 SQL 查询都是以 SELEC&...
    99+
    2022-10-19
  • JS异步的执行顺序是什么
    这篇文章主要介绍“JS异步的执行顺序是什么”,在日常操作中,相信很多人在JS异步的执行顺序是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS异步的执行顺序是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-02
  • where子句的执行顺序是什么
    本篇内容介绍了“where子句的执行顺序是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-18
  • java构造器的执行顺序是什么
    这篇文章给大家介绍java构造器的执行顺序是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1,在没有静态块的情况下,子类的对象创建时,父类的无参构造器-->子类的构造器(产生对象的构造器,如果是无参则执行的是...
    99+
    2023-06-17
  • Java监听器MouseListener的执行顺序是什么
    Java监听器MouseListener的执行顺序是按照以下顺序执行的:1. 鼠标按下事件:mousePressed()2. 鼠标释...
    99+
    2023-08-16
    Java
  • PHP中for循环的执行顺序是什么
    本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑for 循环是 PHP 中最复杂的循环结构。for 循环语句能够按照已知的循环次数进行循环操作,适用于明确知道执行次数的情况。for 循环的语法格式如下:for (初始...
    99+
    2016-02-26
    PHP for循环
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作