**Springboot项目,在使用AspectJ做切面时,使用@order无法指定切面的织入顺序,@Order是SpringIOC容器下管理Bean的执行顺序,而使用ltw的当时在类加载的时候无法就已经植入,其bean不由SpringIoc管理,是不是这样不能指定其织入顺序。
CustomLtwConfig.java
@Configuration
@ComponentScan("com.zakary.qingblog.controller")
@EnableLoadTimeWeaving(aspectjWeaving=ENABLED)
public class CustomLtwConfig{
}
aop.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<!--要织入切面的目标类-->
<!-- <weaver>-->
<!-- <include within="com.zakary.qingblog.*" />-->
<!--<!– <include within="org.springframework.boot..*" />–>-->
<!-- </weaver>-->
<weaver options="-Xset:weaveJavaxPackages=true">
<include within="com.zakary.qingblog..*" />
</weaver>
<!--切面类-->
<aspects>
<!-- <aspect name="com.zakary.qingblog.aop.LoggerAspect" />-->
<aspect name="com.zakary.qingblog.aop.LoginAspect" />
<aspect name="com.zakary.qingblog.aop.InterceptorAspect"/>
<aspect name="com.zakary.qingblog.aop.ParamsCheckAspect"/>
</aspects>
</aspectj>
其中的一个切面
@Aspect
@Order(5)
public class LoginAspect {
private Logger logger= LoggerFactory.getLogger(QingblogApplication.class);
@Pointcut("execution(* com.zakary.qingblog.controller.LoginController.userLogin(..))")
public void loginAop() {}
@Before("loginAop()")
public void before(JoinPoint point) throws Throwable {
Object[] objArgs = point.getArgs();
String mail= AnalysisUtils.getObjectToMap(objArgs[0]).get("userMail").toString();
String password=AnalysisUtils.getObjectToMap(objArgs[0]).get("userPassword").toString();
logger.info("Order(5) User Login : [ userMail : "+mail+"\t , password : "+password+"\t ]");
}
}
你对于Spring Boot项目中使用AspectJ和@Order注解的理解基本是正确的。
在Spring Boot项目中,使用@Order注解无法直接指定AspectJ切面的织入顺序。这是因为@Order注解是用于控制在Spring IoC容器中注册的Bean的执行顺序,而AspectJ切面是在编译时或加载时织入到目标类中,不受Spring IoC容器的管理。
当使用load-time weaving(LTW)来织入AspectJ切面时,切面类不由Spring IoC容器管理,因此无法使用@Order注解来控制切面的织入顺序。
如果你需要确保多个AspectJ切面的织入顺序,请考虑以下几种方法:
使用AspectJ的 declare precedence :在每个切面类中通过declare precedence语句明确指定切面之间的优先级关系。例如,创建一个aspectprecedence.aj文件,在其中定义切面的优先级顺序:
declare precedence: com.example.aspect1, com.example.aspect2
在Spring Boot中将AspectJ切面转化为Spring管理的切面:如果可能的话,将AspectJ切面转化为Spring管理的切面(使用@Component等注解),并将切面类注册为Bean,然后使用@Order注解来指定它们的执行顺序。但这样做可能会限制AspectJ特定的功能。
总的来说,无法直接使用@Order注解来控制AspectJ切面的织入顺序。对于LTW方式织入的切面,需要通过其他方式来指定它们的织入顺序,如使用declare precedence语句或将其转化为Spring管理的切面。