使用@Order控制配置类/AOP/方法/字段的加载顺序详解
作者:公瑾子敬
这篇文章主要介绍了使用@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的使用
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。