日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【springboot中使用aop的具体步骤和示例】

發(fā)布時間:2024/9/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【springboot中使用aop的具体步骤和示例】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.依賴

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

Spring Boot 中使用AOP 非常簡單,假如我們要在項目中打印一些log,在引入了上面的依賴之后,我們新建一個類LogAspectHandler,用來定義切面和處理方法。只要在
類上加個@Aspect 注解即可。@Aspect 注解用來描述一個切面類,定義切面類的時候需要打上這個注解。@Component 注解讓該類交給Spring 來管理。

使用aop的實例:

@Aspect @Component public class LogAspectHandler {private final Logger logger = LoggerFactory.getLogger(this.getClass());/*** 定義一個切面,攔截com.xxx.controller包下的所有方法*/@Pointcut("execution(* com.xxx.controller..*.*(..))")public void pointCut() {}/*** 在上面定義的切面方法之前執(zhí)行該方法* @param joinPoint jointPoint*/@Before("pointCut()")public void doBefore(JoinPoint joinPoint) {logger.info("====doBefore方法進入了====");// 獲取簽名Signature signature = joinPoint.getSignature();// 獲取切入的包名String declaringTypeName = signature.getDeclaringTypeName();// 獲取即將執(zhí)行的方法名String funcName = signature.getName();logger.info("即將執(zhí)行方法為: {},屬于{}包", funcName, declaringTypeName);// 也可以用來記錄一些信息,比如獲取請求的url和ipServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 獲取請求urlString url = request.getRequestURL().toString();// 獲取請求ipString ip = request.getRemoteAddr();logger.info("用戶請求的url為:{},ip地址為:{}", url, ip);}/*** 在上面定義的切面方法之后執(zhí)行該方法* @param joinPoint jointPoint*/@After("pointCut()")public void doAfter(JoinPoint joinPoint) {logger.info("====doAfter方法進入了====");Signature signature = joinPoint.getSignature();String method = signature.getName();logger.info("方法{}已經(jīng)執(zhí)行完", method);}/*** 在上面定義的切面方法返回后執(zhí)行該方法,可以捕獲返回對象或者對返回對象進行增強* @param joinPoint joinPoint* @param result result*/@AfterReturning(pointcut = "pointCut()", returning = "result")public void doAfterReturning(JoinPoint joinPoint, Object result) {Signature signature = joinPoint.getSignature();String classMethod = signature.getName();logger.info("方法{}執(zhí)行完畢,返回參數(shù)為:{}", classMethod, result);// 實際項目中可以根據(jù)業(yè)務做具體的返回值增強logger.info("對返回參數(shù)進行業(yè)務上的增強:{}", result + "增強版");}/*** 在上面定義的切面方法執(zhí)行拋異常時,執(zhí)行該方法* @param joinPoint jointPoint* @param ex ex*/@AfterThrowing(pointcut = "pointCut()", throwing = "ex")public void afterThrowing(JoinPoint joinPoint, Throwable ex) {Signature signature = joinPoint.getSignature();String method = signature.getName();// 處理異常的邏輯logger.info("執(zhí)行方法{}出錯,異常為:{}", method, ex.getMessage());}}

結(jié)果:
訪問

查看打印的日志:

訪問excetion

介紹幾個常用的注解及使用

1.@Pointcut:定義一個切面,即上面所描述的關注的某件事
入口。
2.@Before:在做某件事之前做的事。
3.@After:在做某件事之后做的事。
4.@AfterReturning:在做某件事之后,對其返回值做增強處
理。
5.@AfterThrowing:在做某件事拋出異常時處理。

???@Pointcut 注解指定一個切面,定義需要攔截的東西,這里介紹兩個常用的表達式:
一個是使用execution(),另一個是使用annotation()。
以execution(* com.itcodai.course09.controller…*.*(…))) 表達式為例,
語法如下:
execution() 為表達式主體
第一個*號的位置:表示返回值類型,*表示所有類型
包名:表示需要攔截的包名,后面的兩個句點表示當前包和當
前包的所有子包,com.xxx.controller 包、子包下所有類的方法
第二個*號的位置:表示類名,*表示所有類
*(…) :這個星號表示方法名,*表示所有的方法,后面括弧
里面表示方法的參數(shù),兩個句點表示任何參數(shù)
annotation() 方式是針對某個注解來定義切面,比如我們對具有@GetMapping 注解的方法做切面,可以如下定義切面

@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)") public void annotationCut() {}

???@Before 注解
@Before 注解指定的方法在切面切入目標方法之前執(zhí)行,可以做一些log 處理,也可以做一些信息的統(tǒng)計,比如獲取用戶的請求url 以及用戶的ip 地址等等,這個在做個人站點的時候都能用得到,都是常用的方法。例如上面的

@Before("pointCut()")public void doBefore(JoinPoint joinPoint) {logger.info("====doBefore方法進入了====");// 獲取簽名Signature signature = joinPoint.getSignature();// 獲取切入的包名String declaringTypeName = signature.getDeclaringTypeName();// 獲取即將執(zhí)行的方法名String funcName = signature.getName();logger.info("即將執(zhí)行方法為: {},屬于{}包", funcName, declaringTypeName);// 也可以用來記錄一些信息,比如獲取請求的url和ipServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 獲取請求urlString url = request.getRequestURL().toString();// 獲取請求ipString ip = request.getRemoteAddr();logger.info("用戶請求的url為:{},ip地址為:{}", url, ip);}

@After 注解
@After 注解和@Before 注解相對應,指定的方法在切面切入目標方法之后執(zhí)行,也可以做一些完成某方法之后的log 處理。

@AfterThrowing 注解
顧名思義,@AfterThrowing 注解是當被切方法執(zhí)行時拋出異常時,會進入@AfterThrowing 注解的方法中執(zhí)行,在該方法中可以做一些異常的處理邏輯。要注意的是throwing 屬性的值必須要和參數(shù)一致,否則會報錯。該方法中的第二個入?yún)⒓礊?br /> 拋出的異常。

總結(jié)

以上是生活随笔為你收集整理的【springboot中使用aop的具体步骤和示例】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。