Springboot-Aop案例

pom.xml如下,需要引入spring-boot-starter-aop、spring-boot-starter-logging

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!--日志-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!--日志-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
    </dependencies>

這里實(shí)現(xiàn)一個(gè) 只要方法上打了@Log注解,就會(huì)Aop攔截的案例
Log類定義如下:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 日志記錄注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    String Value() default "";
}

Aop類定義如下

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.Date;

@Component
@Aspect
public class LogAopDemo {
    private static final Logger logger = LoggerFactory.getLogger(LogAopDemo.class);

    /**
     * 切入點(diǎn),對(duì)注解@Log進(jìn)行攔截
     */
    @Pointcut("@annotation(com.example.springboot3.Log)")
    public void pointcut() {
    }

    /**
     * 環(huán)繞proceedingJoinPoint
     * @return
     */
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object result = null;

        //獲取攔截的方法
        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        Method method = signature.getMethod();

        logger.info(String.format("【AOP】攔截方法:%s,開始時(shí)間:%s。", method.getName(), new Date().toString()));
        logger.info("【AOP】Around(執(zhí)行方法前):"+method.getName()+",傳入?yún)?shù):"+Arrays.asList(proceedingJoinPoint.getArgs()));

        //攔截方法調(diào)用,此處可做一定的邏輯,如果是對(duì)權(quán)限進(jìn)行過濾,沒有權(quán)限不可調(diào)用,可return null
        result = proceedingJoinPoint.proceed();
        logger.info(String.format("【AOP】攔截方法:%s,結(jié)束時(shí)間:%s。", method.getName(), new Date().toString()));
        return result;
    }
    
}

這里定義好了之后,我們?cè)谀硞€(gè)方法上打下@Log注解,驗(yàn)證是否實(shí)現(xiàn)攔截


image.png

訪問UserController的get方法后,可以從日志中看到攔截成功


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容