亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

詳解使用Spring Boot的AOP處理自定義注解

2024-07-13 10:16:28
字體:
來源:轉載
供稿:網友

上一篇文章Java 注解介紹講解了下Java注解的基本使用方式,并且通過自定義注解實現了一個簡單的測試工具;本篇文章將介紹如何使用Spring Boot的AOP來簡化處理自定義注解,并將通過實現一個簡單的方法執行時間統計工具為樣例來講解這些內容。

AOP概念

面向側面的程序設計(aspect-oriented programming,AOP,又譯作面向方面的程序設計、觀點導向編程、剖面導向程序設計)是計算機科學中的一個術語,指一種程序設計范型。該范型以一種稱為側面(aspect,又譯作方面)的語言構造為基礎,側面是一種新的模塊化機制,用來描述分散在對象、類或函數中的橫切關注點(crosscutting concern)。

側面的概念源于對面向對象的程序設計的改進,但并不只限于此,它還可以用來改進傳統的函數。與側面相關的編程概念還包括元對象協議、主題(subject)、混入(mixin)和委托。

注釋:以上定義源自中文維基百科(如果訪問不了,可以通過修改系統的hosts文件訪問, 198.35.26.96 zh.wikipedia.org #中文維基百科 ,只能幫到這了,如果還是上不了,那就麻煩上網搜索下怎么修改系統的hosts文件,不同系統下hosts文件位置不一樣,如果是Linux或者Mac系統,我就直接告訴你吧,一般文件路徑是 /etc/hosts ),AOP這個詞的翻譯有點和國內主流叫法不一致,國內主流都把AOP譯做「面向切面編程」,大家不要拘泥于叫法,知道指的是同一個東西即可。

估計,你看了這個定義也是懵的,如果想深入了解可以去知乎看看大佬們是如何掰扯的 什么是面向切面編程AOP? 。我這邊還是就直接上例子了吧。

Spring Boot的AOP環境準備

在 pom.xml 中引入相應的依賴模塊

<!-- Spring Boot依賴包 --><parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>1.5.1.RELEASE</version></parent><dependencies>  <!-- AOP依賴模塊 -->  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-aop</artifactId>  </dependency>  <!-- Web依賴模塊 -->  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>  </dependency></dependencies>

先實現一個簡單的Web請求處理

一個簡單的處理Web請求的Controller。

package com.craneyuan.controller;import com.craneyuan.service.IHelloWorldService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloWorldController {  @Autowired  private IHelloWorldService helloWorldService;  @RequestMapping(value = "/hello", method = RequestMethod.GET)  public String hello(String name) {    return helloWorldService.getHelloMessage(name);  }}

一個簡單的HelloWorld服務實現類,接口的定義我就不展示代碼了。

package com.craneyuan.service.impl;import com.craneyuan.annotation.AnalysisActuator;import com.craneyuan.service.IHelloWorldService;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import java.util.Optional;@Servicepublic class HelloWorldServiceImpl implements IHelloWorldService {  public String getHelloMessage(String name) {    return "Hello " + Optional.ofNullable(name).orElse("World!");  }}

這樣一個簡單的Web服務就弄好了,你可以啟動項目用 curl 命令調用試下,例如: curl -XGET -i "http://127.0.0.1:8080/hello?name=Java" ,如果一切順利的話,你將會得到類似下面這樣的響應:

HTTP/1.1 200Content-Type: text/plain;charset=UTF-8Content-Length: 11Date: Thu, 11 Jan 2018 09:45:38 GMTHello Java

使用自定義注解來統計方法的執行時間

先定義一個用來統計方法執行時間的注解。

package com.craneyuan.annotation;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 AnalysisActuator {  String note() default "";}

然后定義一個切面,來處理剛剛定義的注解。

package com.craneyuan.aspect;import com.craneyuan.annotation.AnalysisActuator;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.core.annotation.Order;import org.springframework.stereotype.Component;@Aspect@Componentpublic class AnalysisActuatorAspect {  final static Logger log = LoggerFactory.getLogger(AnalysisActuatorAspect.class);  ThreadLocal<Long> beginTime = new ThreadLocal<>();  @Pointcut("@annotation(analysisActuator)")  public void serviceStatistics(AnalysisActuator analysisActuator) {  }  @Before("serviceStatistics(analysisActuator)")  public void doBefore(JoinPoint joinPoint, AnalysisActuator analysisActuator) {    // 記錄請求到達時間    beginTime.set(System.currentTimeMillis());    log.info("cy666 note:{}", analysisActuator.note());  }  @After("serviceStatistics(analysisActuator)")  public void doAfter(AnalysisActuator analysisActuator) {    log.info("cy666 statistic time:{}, note:{}", System.currentTimeMillis() - beginTime.get(), analysisActuator.note());  }}

最后,只要在需要統計執行時間的方法上加上 @AnalysisActuator 注解就行了。

package com.craneyuan.service.impl;import com.craneyuan.annotation.AnalysisActuator;import com.craneyuan.service.IHelloWorldService;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import java.util.Optional;@Servicepublic class HelloWorldServiceImpl implements IHelloWorldService {  @AnalysisActuator(note = "獲取聊天信息方法")  public String getHelloMessage(String name) {    return "Hello " + Optional.ofNullable(name).orElse("World!");  }}

啟動項目,用 curl 命令隨便調用一下,如果順利的話就可以觀察到切面打印的日志了。

...cy666 statistic time:4, note:獲取聊天信息方法

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美高清理论片| 欧洲一区二区视频| 美日韩精品免费观看视频| 欧美色欧美亚洲高清在线视频| 国产成人福利视频| 少妇av一区二区三区| 97免费视频在线| 国产日韩欧美夫妻视频在线观看| 国产91精品久久久久久久| 久久久久久91| 精品偷拍一区二区三区在线看| 亚洲自拍偷拍网址| 97在线视频免费观看| 日韩国产精品亚洲а∨天堂免| 亚洲码在线观看| 日韩精品欧美国产精品忘忧草| 亚洲国产一区二区三区在线观看| 日韩免费在线看| 国产精品色午夜在线观看| 国产精品久久久久久久久久ktv| 国产精品视频精品| 国产精品视频最多的网站| 精品久久久久久亚洲精品| 国产精品久久视频| 日韩av电影手机在线| 欧美午夜激情在线| 日日狠狠久久偷偷四色综合免费| 亚洲热线99精品视频| zzijzzij亚洲日本成熟少妇| 国语自产精品视频在线看抢先版图片| 色悠久久久久综合先锋影音下载| 黄色成人av在线| 亚洲三级免费看| 国产日韩在线亚洲字幕中文| 欧美日韩亚洲一区二区三区| 欧美精品久久久久| 国产午夜精品全部视频在线播放| 国产精品久久久久久亚洲影视| 中文亚洲视频在线| 欧美午夜激情视频| 色婷婷综合成人| 亚洲成人亚洲激情| 国产精品欧美一区二区三区奶水| 性亚洲最疯狂xxxx高清| 日韩电影中文字幕在线观看| 国产午夜精品免费一区二区三区| 日韩av免费网站| 国产美女搞久久| 亚洲va欧美va在线观看| 午夜剧场成人观在线视频免费观看| 亚洲欧美另类中文字幕| 国产精品香蕉国产| 91久久在线播放| 日韩亚洲欧美成人| 久热国产精品视频| 欧美色欧美亚洲高清在线视频| 国产亚洲成精品久久| 欧美国产日本高清在线| 精品av在线播放| 亚洲色图欧美制服丝袜另类第一页| 亚洲国产一区自拍| 日韩av在线不卡| 欧美精品videosex性欧美| 亚洲xxx视频| 97碰在线观看| 国产精品亚洲片夜色在线| 久久精品亚洲国产| 亚洲国产日韩欧美在线动漫| 国产精品入口免费视| 色噜噜亚洲精品中文字幕| 成人黄色网免费| 亚洲视频在线播放| 美女av一区二区三区| 久久99热这里只有精品国产| 国产精品观看在线亚洲人成网| 亚洲综合中文字幕在线| 爱福利视频一区| 美女福利视频一区| 日韩av在线影视| 久久国产精品久久久久久| 亚洲影院色无极综合| 国产精品夜间视频香蕉| 久久久久久国产精品三级玉女聊斋| 欧美韩国理论所午夜片917电影| 欧美黄色三级网站| 91av在线影院| 亚洲欧美中文在线视频| 精品久久久av| 欧美专区在线视频| 91精品国产成人www| 秋霞av国产精品一区| 国产欧美一区二区三区在线看| 久久国产视频网站| 国产精品亚洲自拍| 亚洲а∨天堂久久精品喷水| 国产在线精品播放| 91在线无精精品一区二区| 亚洲老头同性xxxxx| 国产精品一区二区三区久久久| 日韩中文字幕第一页| 亚洲精品不卡在线| 亚洲人成电影网站色…| 国产成+人+综合+亚洲欧美丁香花| 国产精品va在线播放| 91精品国产高清久久久久久| 欧美专区日韩视频| 九九视频这里只有精品| 日韩欧美在线播放| 亚洲无av在线中文字幕| 91av网站在线播放| 中文字幕日韩免费视频| 欧美国产日韩中文字幕在线| 日韩中文字幕免费| 成人乱人伦精品视频在线观看| 日韩av在线免费观看| 国产成人精品久久二区二区91| 国产精品27p| 欧美影院成年免费版| 国产精品扒开腿做爽爽爽视频| 一区二区三区日韩在线| 国模吧一区二区| 亚洲美女性生活视频| 国产日韩在线亚洲字幕中文| 91久久精品国产91久久| 日本久久久久久| 欧美噜噜久久久xxx| 国产一区二区三区毛片| 亚洲精品视频在线播放| 综合国产在线视频| 97视频在线观看视频免费视频| 伊人久久久久久久久久久久久| 国产在线精品成人一区二区三区| 欧美肥臀大乳一区二区免费视频| 亚洲香蕉伊综合在人在线视看| 亚洲国产天堂久久综合网| 中文字幕亚洲字幕| 亚洲片国产一区一级在线观看| 久久国产精品视频| 美日韩在线视频| 日韩在线观看免费av| 日韩黄色在线免费观看| 欧美日韩在线视频首页| 国产精品久久久久久影视| 久久久久国产精品www| 欧美国产精品日韩| 国产视频999| 激情懂色av一区av二区av| 欧美夫妻性生活xx| 精品在线欧美视频| 奇米四色中文综合久久| 国产精品久久久久91| 中文字幕欧美日韩在线| 日韩精品中文字幕在线| 国产亚洲精品一区二555| 88国产精品欧美一区二区三区| 国产精品18久久久久久首页狼| 国产婷婷97碰碰久久人人蜜臀| 久久精品国产久精国产一老狼| 精品二区三区线观看| 中文字幕欧美在线| 91免费看国产| 亚洲自拍偷拍在线| 日本亚洲欧洲色| 欧美色视频日本版|