1. 程式人生 > >Spring Boot 應用AOP

Spring Boot 應用AOP

通知 匹配 ide CA AS 結束 RR 依賴 表示

# Spring Boot 應用AOP

一、在pom中添加依賴

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

二、目標類

@RestController
public class StudentController {

    @GetMapping(value = "/aoptest")
    public String aopTest(){
        return " AOP test success!";
    }
}

三、切面類

代碼示例如下:

@Aspect
@Configuration
public class HttpAspect {

    //使用org.slf4j.Logger,這是Spring實現日誌的方法
    private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);

    /**
    * 定義AOP掃描路徑
    */
    @Pointcut("execution(public * com.example.myproject.controller.StudentController.*())")
    public void log() {
    }

    /**
    * 記錄HTTP請求開始時的日誌
    */
    @Before("log()")
    public void doBefore(JoinPoint joinPoint) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //URL
        logger.info("url={}", request.getRequestURI());
        //method
        logger.info("method={}", request.getMethod());
        //ip
        logger.info("ip={}", request.getRemoteAddr());
        //類方法
        logger.info("class={} and method name = {}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());
        //參數
        logger.info("參數={}", joinPoint.getArgs());
    }

    /**
    * 記錄HTTP請求結束時的日誌
    */
    @After("log()")
    public void doAfter() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        logger.info("url = {} end of execution", request.getRequestURL());
    }

    /**
    * 獲取返回內容
    *
    * @param object
    */
    @AfterReturning(returning = "object", pointcut = "log()")
    public void doAfterReturn(Object object) {
        logger.info("response={}", object.toString());
    }
}

PS:Spring通過aop.xml<aop:config>配置目標對象、切入點等之間的聯系。示例配置如下:

<aop:config>
    <aop:aspect id="log" ref="HttpAspect">
        <aop:pointcut id="printLog" expression="execution(* com.example.myproject.controller.StudentController.*())" />
        <aop:before method="doBefore" pointcut-ref="printLog" />
        <aop:after method="doAfter" pointcut-ref="printLog" />
    </aop:aspect>
</aop:config>
  • 註解解釋

    • @Aspect:描述一個切面類。
    • @Configuration:描述一個配置類。
    • @Pointcut:聲明一個切入點,切入點決定了連接點關註的內容,可控制通知什麽時候執行。
    • @Before:前置通知。在某連接點之前執行的通知,但這個通知不能阻止連接點之前的執行流程(除非它拋出一個異常)。
    • @After 最終通知。當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。
    • @AfterReturning:後置通知。在某連接點正常完成後執行的通知,通常在一個匹配的方法返回的時候執行。
  • 切入點表達式

    格式如下:

    execution([可見性] 返回類型 [聲明類型].方法名(參數) [異常])
    • [] :表示可選。

    通配符:

    • *:匹配所有字符.
    • ..:一般用於匹配多個包,多個參數.
    • +:表示類及其子類.

  運算符:&&||!

四、啟動類

@SpringBootApplication
public class MyprojectApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyprojectApplication.class);
    }

    public static void main(String[] args) {

        SpringApplication.run(MyprojectApplication.class, args);
    }
}

PS: spring-boot 默認以啟動類所在包為根路徑,掃描當前包及子包。

Spring Boot 應用AOP