在Spring Boot框架中使用AOP

餓了麼物流技術團隊發表於2018-08-06

作者簡介

彬哥,目前任職於餓了麼,從事餓了麼物流側核心系統的開發工作,喜愛鑽研各種技術,用技術解決實際問題。

Spring Boot是基於Spring的用來開發Web應用的框架,功能與Spring MVC有點類似,但是Spring Boot的一大特點就是需要的配置非常少。Spring Boot推薦convention over configuration,也就是約定大於配置,因此Spring Boot會幫你做許多自動的配置,並且Spring Boot使用的是Java Config,幾乎可以做到零XML檔案配置。

假設現在有這樣一種場景,需要統計某個介面的處理耗時,我們可以使用AOP來實現,在Spring Boot中使用AOP也非常簡單,只需要一點簡單的配置即可。

需要使用AOP的類

@RestController
public class DownloadController {

    @Autowired
    private XmlDownloadService downloadService;

    @Autowired
    private XmlFileClearService clearService;

    @RequestMapping("/download")
    @Timer
    public String download() throws Exception {
        downloadService.download();
        clearService.compress();
        clearService.clearAll();
        return "ok";
    }

}
複製程式碼

這是一個使用@RestController註解的Controller類,這個類會去下載一些XML檔案,然後壓縮,最後刪除下載的XML檔案。現在我們要統計整個處理過程的耗時,使用AOP來實現。在download上使用了一個@Timer註解,這是一個自定義的普通註解,用來標記這個方法作為一個切點。

Aspect類

@Aspect
@Component
public class VipAspect {

    private static final Logger logger = LoggerFactory.getLogger(VipAspect.class);

    private long start;

    //定義切點
    @Pointcut("@annotation(cn.magicwindow.mlink.content.annotation.Timer)")
    public void timer(){}

    //在方法執行前執行
    @Before("timer()")
    public void before() {
        start = System.currentTimeMillis();
    }

    //在方法執行後執行
    @After("timer()")
    public void after() {
        long now = System.currentTimeMillis();
        logger.info("job took time {}s in summary", (now - start) / 1000);
    }
}
複製程式碼

這裡使用了註解來標記切點,也可以直接按照方法名稱來定義,具體的使用方法可以參考官方文件。

配置Spring Boot支援AOP

@Configuration
@EnableAspectJAutoProxy
public class Config {
}
複製程式碼

只需要使用@EnableAspectJAutoProxy註解開啟Spring Boot的AOP支援即可。

最後,在呼叫download方法之後就會列印出本次處理的用時。




閱讀部落格還不過癮?

歡迎大家掃二維碼加入交流群,討論和部落格有關的技術問題,還可以和博主有更多互動

在Spring Boot框架中使用AOP
部落格轉載、線下活動及合作等問題請郵件至 shadowfly_zyl@hotmail.com 進行溝通

相關文章