【springboot中使用aop的具体步骤和示例】
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() {}/*** 在上面定義的切面方法之前執行該方法* @param joinPoint jointPoint*/@Before("pointCut()")public void doBefore(JoinPoint joinPoint) {logger.info("====doBefore方法進入了====");// 獲取簽名Signature signature = joinPoint.getSignature();// 獲取切入的包名String declaringTypeName = signature.getDeclaringTypeName();// 獲取即將執行的方法名String funcName = signature.getName();logger.info("即將執行方法為: {},屬于{}包", 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);}/*** 在上面定義的切面方法之后執行該方法* @param joinPoint jointPoint*/@After("pointCut()")public void doAfter(JoinPoint joinPoint) {logger.info("====doAfter方法進入了====");Signature signature = joinPoint.getSignature();String method = signature.getName();logger.info("方法{}已經執行完", method);}/*** 在上面定義的切面方法返回后執行該方法,可以捕獲返回對象或者對返回對象進行增強* @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("方法{}執行完畢,返回參數為:{}", classMethod, result);// 實際項目中可以根據業務做具體的返回值增強logger.info("對返回參數進行業務上的增強:{}", result + "增強版");}/*** 在上面定義的切面方法執行拋異常時,執行該方法* @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("執行方法{}出錯,異常為:{}", method, ex.getMessage());}}結果:
訪問
查看打印的日志:
訪問excetion
介紹幾個常用的注解及使用
1.@Pointcut:定義一個切面,即上面所描述的關注的某件事
入口。
2.@Before:在做某件事之前做的事。
3.@After:在做某件事之后做的事。
4.@AfterReturning:在做某件事之后,對其返回值做增強處
理。
5.@AfterThrowing:在做某件事拋出異常時處理。
???@Pointcut 注解指定一個切面,定義需要攔截的東西,這里介紹兩個常用的表達式:
一個是使用execution(),另一個是使用annotation()。
以execution(* com.itcodai.course09.controller…*.*(…))) 表達式為例,
語法如下:
execution() 為表達式主體
第一個*號的位置:表示返回值類型,*表示所有類型
包名:表示需要攔截的包名,后面的兩個句點表示當前包和當
前包的所有子包,com.xxx.controller 包、子包下所有類的方法
第二個*號的位置:表示類名,*表示所有類
*(…) :這個星號表示方法名,*表示所有的方法,后面括弧
里面表示方法的參數,兩個句點表示任何參數
annotation() 方式是針對某個注解來定義切面,比如我們對具有@GetMapping 注解的方法做切面,可以如下定義切面
???@Before 注解
@Before 注解指定的方法在切面切入目標方法之前執行,可以做一些log 處理,也可以做一些信息的統計,比如獲取用戶的請求url 以及用戶的ip 地址等等,這個在做個人站點的時候都能用得到,都是常用的方法。例如上面的
@After 注解
@After 注解和@Before 注解相對應,指定的方法在切面切入目標方法之后執行,也可以做一些完成某方法之后的log 處理。
@AfterThrowing 注解
顧名思義,@AfterThrowing 注解是當被切方法執行時拋出異常時,會進入@AfterThrowing 注解的方法中執行,在該方法中可以做一些異常的處理邏輯。要注意的是throwing 屬性的值必須要和參數一致,否則會報錯。該方法中的第二個入參即為
拋出的異常。
總結
以上是生活随笔為你收集整理的【springboot中使用aop的具体步骤和示例】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【springboot异常处理】用异常信
- 下一篇: 【springboot中使用拦截器】