流光之中 2020-04-01 17:27 采纳率: 0%
浏览 201

AspectJ使用LTW织入方式,无法指定切面织入顺序

**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.*" />-->
<!--&lt;!&ndash;        <include within="org.springframework.boot..*" />&ndash;&gt;-->
<!--    </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 ]");
    }
}
  • 写回答

1条回答 默认 最新

  • 下雨天娃娃鱼 2023-09-20 11:48
    关注
    
    你对于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管理的切面。
    
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器