Skip to content

AspectJ框架

概念

AspectJ是一种基于注解或者XML配置的AOP(面向切面编程)框架,它可以让你在不修改源代码的情况下,将横切关注点(如日志、事务管理等)模块化地应用到应用程序中。

引入架包

xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.20.1</version>
    </dependency>
</dependencies>

备注

架包安装成功,但@Aspect注解无法引入

原因是aspectjweaver在依赖里,有<scope>runtime</scope>这行代码

runtime 是运行的意思。指的是直接在运行时所需要的包,而非在编译时等时候需要的包

将这行代码去掉就可以正常引入了

代码演示

项目:misscmszb/ResultAspect

需求:对controller层结果返回UnifyResponseVO的方法进行处理,如果message为null,就通过code获取对应的message

ResultAspect.java

java
package com.zb.misscmszb.core.aop;

import com.zb.misscmszb.core.configuration.CodeMessageConfiguration;
import com.zb.misscmszb.vo.UnifyResponseVO;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

/**
 * 对返回结果为UnifyResponseVO的控制器层方法进行处理
 * 如果message为null,会通过code获取对应信息
 *
 */
@Aspect
@Component
public class ResultAspect {
    @AfterReturning(returning = "result", pointcut = "execution(public * com.zb.misscmszb.controller..*.*(..))")
    public void doAfterReturning(UnifyResponseVO<String> result) {
        int code = result.getCode();
        String messageOfVO = result.getMessage();
        // code-message.properties 中配置的 message
        String messageOfConfiguration = CodeMessageConfiguration.getMessage(code);

        // 如果 code-message.properties 中指定了相应的 message 并且 UnifyResponseVO 的 message 为null
        // 则使用 messageOfConfiguration 替换 messageOfVO
        if (StringUtils.hasText(messageOfConfiguration) && !StringUtils.hasText(messageOfConfiguration)) {
            result.setMessage(messageOfConfiguration);
        }
    }
}

如有转载或 CV 的请标注本站原文地址