使用@Order控制配置类/AOP/方法/字段的加载顺序详解

目录
  • @Order控制配置类/AOP/方法/字段的加载顺序
    • 1.AOP加载顺序
    • 2.配置类加载顺序
  • @Order使用与Aop多切面执行顺序

@Order控制配置类/AOP/方法/字段的加载顺序

1.AOP加载顺序

    @Component
    @Aspect
    @Order(1)
    public class Aspect1 {
        ...
        System.out.println("aop-1 加载了");
    }
    @Component
    @Aspect
    @Order(2)
    public class Aspect2 {
        ...
        System.out.println("aop-2 加载了");
    }

执行顺序:

  • aop-1 加载了
  • aop-2 加载了

2.配置类加载顺序

@Configuration
@Order(1)
public class DemoConfig1 {
    @Bean
    public Demo1Service demo1Service(){
        System.out.println("config-1 加载了");
        return new Demo1Service();
    }
}
@Configuration
@Order(2)
public class DemoConfig2 {
    @Bean
    public Demo2Service demo2Service(){
        System.out.println("config-2 加载了");
        return new Demo2Service();
    }
}

执行顺序:

  • config-1 加载了
  • config-2 加载了

tips:

Integer.MIN_VALUE <= Order <= Integer.MAX_VALUE

Order值越小,优先级越高!

@Order的作用范围:

ElementType.TYPE, ElementType.METHOD, ElementType.FIELD

@Order使用与Aop多切面执行顺序

@Order:设置该类在spring容器中的加载顺序, 越小越早优先加载

多个Aop是可以切同一点的, 比如, 想把@ApiOperation(Swag注解的)地方再自定义增强一下, 比如 持久化一行操作日志到数据库, 那就可以自定义一个注解, 切同一个位置, 干你自己想干的事.

那多个Aop的优先顺序(默认按切面工具类的名称首字母a-z执行顺序, 也就是spring默认的加载顺序), 可以使用@order自己定义顺序,

值得注意的是:

  • 环绕前置(即point.proceed()前面的代码)
  • 环绕后置(即point.proceed()后面的代码)
try{
     try{
         doBefore();//对应@Before注解的方法切面逻辑
         method.invoke();
     }finally{
         doAfter();//对应@After注解的方法切面逻辑
     }
     doAfterReturning();//对应@AfterReturning注解的方法切面逻辑
     //在
 }catch(Exception e){
      doAfterThrowing();//对应@AfterThrowing注解的方法切面逻辑
 }

另外, 如果情况是允许耦合的, 可以创建新注解继承原注解, 或这继承多个原注解, 这样就自定义扩展并组合注解了

todo:@AfterReturning的使用

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 一篇文章带你了解Spring AOP 的注解

    目录 1.xml 的方式实现 AOP ①.接口 UserService ②.实现类 UserServiceImpl ③.切面类,也就是通知类 MyAspect ④.AOP配置文件 applicationContext.xml ⑤.测试 ⑥.控制台打印结果 2.注解实现 AOP ①.导入相应的 jar 包,以及在 applicationContext.xml 文件中导入相应的命名空间. ②.注解配置 bean xml配置: 注解配置: ③.配置扫描注解识别 ④.注解配置 AOP 一.我们用xml配

  • Spring AOP的使用详解

    什么是AOP AOP(Aspect Oriented Programming 面向切面编程),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 常用于日志记录,性能统计,安全控制,事务处理,异常处理等等. 定义AOP术语 切面(Aspect):切

  • springboot配置文件的加载顺序解析

    这篇文章主要介绍了springboot配置文件的加载顺序解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springboot启动时会扫描一下位置的application.properties或者application.yml文件作为默认配置文件: file:./config/ file:./ classpath:/config/ classpath:/ 以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置会覆盖低优先级配置

  • Spring注解配置AOP导致通知执行顺序紊乱解决方案

    今天在测试Spring的AOP时,发现使用注解配置AOP的方式会导致通知的执行顺序紊乱.[最终通知居然在异常通知之前执行了] 测试代码 (1)定义TargetInterface目标接口 public interface TargetInterface { public abstract void targetProxy(); } (2)定义TargetImpl目标类 @Component("target") public class TargetImpl implements Targ

  • 使用@Order控制配置类/AOP/方法/字段的加载顺序详解

    目录 @Order控制配置类/AOP/方法/字段的加载顺序 1.AOP加载顺序 2.配置类加载顺序 @Order使用与Aop多切面执行顺序 @Order控制配置类/AOP/方法/字段的加载顺序 1.AOP加载顺序     @Component     @Aspect     @Order(1)     public class Aspect1 {         ...         System.out.println("aop-1 加载了");     }     @Compon

  • classloader类加载器_基于java类的加载方式详解

    基础概念 Classloader 类加载器,用来加载 Java 类到 Java 虚拟机中.与普通程序不同的是.Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader. JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现

  • Java 配置加载机制详解及实例

    前言 现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty-等等数都数不过来的软件,要满足通用性,都会提供配置文件供使用者定制功能. 甚至有一些例如Netty这样的网络框架,几乎完全就是由配置驱动,这样的软件我们也通常称之为"微内核架构"的软件.你把它配置成什么,它就是什么. It is what you configure it to be. 最常见的配置文件格式是XML, Properties等等文件. 本文探讨加载配置中最通用也是最常见的场

  • Spring AOP切面解决数据库读写分离实例详解

    Spring AOP切面解决数据库读写分离实例详解 为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如何做到把数据写到master库,而读取数据的时候,从slave库读取.如果应用程序判断失误,把数据写入到slave库,会给系统造成致命的打击. 解决读写分离的方案很多,常用的有SQL解析.动态设置数据源.SQL解析主要是通过分析sql语句是insert/select/update/delete中的哪一种,从而对

  • 如何正确控制springboot中bean的加载顺序小结篇

    1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功能. 在一般业务场景,可能你不大关心一个bean是如何被注册进spring容器的.只需要把需要注册进容器的bean声明为@Component即可,spring会自动扫描到这个Bean完成初始化并加载到spring上下文容器. 而当你在项目启动时需要提前做一个业务的初始化工作时,或者你正在开发某个中间

  • SpringBoot使用AOP实现统计全局接口访问次数详解

    目录 AOP是什么 AOP的作用和优势 常见的动态代理技术 AOP相关概念 实现 AOP是什么 AOP(Aspect Oriented Programming),也就是面向切面编程,是通过预编译方式和运行期间动态代理实现程序功能的传统已维护的一种技术. AOP的作用和优势 作用:在程序运行期间,在不修改源代码的情况下对某些方法进行功能增强 优势:减少重复代码,提高开发效率,并且便于维护 常见的动态代理技术 jdk代理:基于接口的动态代理技术 cglib代理:基于父类的动态代理技术 AOP相关概念

  • JPA @Basic单表查询如何实现大字段懒加载

    JPA @Basic单表查询实现大字段懒加载 近期看了JPA@Basic注解的使用,看到该注解可以设置字段的懒加载. 1.以前碰到的懒加载: 我们知道,多表关联的时候,我们是可以配置懒加载的,比如一个Company类,里面可以关联员工表,办公设备表,当我们查看公司信息的时候,我们并不需要直接加载员工表,办公设备表,只需要在用户查看员工,查看设备的时候再加载,这样可以提高加载效率. 长话短说,大概是这样子的 @Entity @Table(name = "Company") public

  • Spring AOP与AspectJ的对比及应用详解

    目录 1 简介 2 Spring AOP vs AspectJ 2.1 织入方式 2.2 Joinpoints 2.3 性能 3 Spring Boot使用AspectJ 3.1 引入依赖 3.2 被AOP的对象 3.3 配置Aspect 3.4 maven插件 3.5 执行及测试 3.6 一些遇到的错误 4 总结 1 简介 AOP,即面向切面编程是很常用的技术,特别是在Java Web开发中.而最流行的AOP框架分别是Spring AOP和AspectJ. 2 Spring AOP vs As

  • Java8默认方法Default Methods原理及实例详解

    这篇文章主要介绍了Java8默认方法Default Methods原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java 8 引入了新的语言特性--默认方法(Default Methods). Default methods enable new functionality to be added to the interfaces of libraries and ensure binary compatibility wit

  • Servlet方法生命周期及执行原理详解

    目录 快速入门 创建JavaEE项目 实现接口中的抽象方法 执行 执行原理 Servlet中的生命周期方法 1.被创建:执行init方法,只执行一次 2.提供服务:执行service方法,执行多次 3.被销毁:执行destroy方法,只执行一次 Servlet3.0 Servlet体系结构 GenericServlet HttpServlet Servlet相关配置 快速入门 创建JavaEE项目 定义一个类,实现Servlet接口 public class ServletDemo1 imple

随机推荐