您好,登錄后才能下訂單哦!
一、AOP
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。 AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。
二、實現
引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
新建SysLog類
package com.example.aop.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 SysLog { String value() default " "; }
新建SysLogAspect類
package com.example.aop.annotation; import com.example.aop.service.LogService; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.lang.reflect.Method; @Aspect @Component public class SysLogAspect { @Autowired private LogService logService; @Pointcut("@annotation(com.example.aop.annotation.SysLog)") public void logPointCut() {} @Before("logPointCut()") public void before(JoinPoint joinPoint) { long beginTime = System.currentTimeMillis(); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); SysLog annotation = method.getAnnotation(SysLog.class); String value = annotation.value(); Object[] args = joinPoint.getArgs(); try { logService.log(beginTime, "before " + method.getName()); } catch (Exception e) { } } @Around("logPointCut()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { long beginTime = System.currentTimeMillis(); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); SysLog annotation = method.getAnnotation(SysLog.class); String value = annotation.value(); Object[] args = joinPoint.getArgs(); Object object = joinPoint.proceed(args); try { logService.log(beginTime, "around " + method.getName()); } catch (Exception e) { } return object; } @After("logPointCut()") public void after(JoinPoint joinPoint) { long beginTime = System.currentTimeMillis(); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); SysLog annotation = method.getAnnotation(SysLog.class); String value = annotation.value(); Object[] args = joinPoint.getArgs(); try { logService.log(beginTime, "after " + method.getName()); } catch (Exception e) { } } @AfterReturning("logPointCut()") public void afterReturning(JoinPoint joinPoint) { long beginTime = System.currentTimeMillis(); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); SysLog annotation = method.getAnnotation(SysLog.class); String value = annotation.value(); Object[] args = joinPoint.getArgs(); try { logService.log(beginTime, "after returning " + method.getName()); } catch (Exception e) { } } @AfterThrowing("logPointCut()") public void afterThrowing(JoinPoint joinPoint) { long beginTime = System.currentTimeMillis(); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); SysLog annotation = method.getAnnotation(SysLog.class); String value = annotation.value(); Object[] args = joinPoint.getArgs(); try { logService.log(beginTime, "after throwing " + method.getName()); } catch (Exception e) { } } }
新建TestService類
package com.example.aop.service; import com.example.aop.dto.TestDomain; import com.example.aop.annotation.SysLog; import org.springframework.stereotype.Service; @Service public class TestService { @SysLog("log-1") public void log1(String name, TestDomain testDomain) { System.out.println("print log 1" + name + " " + testDomain.toString()); } @SysLog("log-2") public void log2(String name, TestDomain testDomain) { System.out.println("print log 2" + name + " " + testDomain.toString()); } @SysLog("throw-exception") public void throwException() { System.out.println("throw exception"); int i = 3/0; } }
新建TestController
package com.example.aop.controller; import com.example.aop.dto.TestDomain; import com.example.aop.service.TestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @Autowired private TestService testService; @GetMapping("test") public String test(@RequestParam("p1") String p1) { TestDomain testDomain = new TestDomain(); testDomain.setId("1"); testDomain.setTitle("t1"); testService.log1(p1, testDomain); testService.log2(p1, testDomain); testService.throwException(); return "hello aop"; } }
三、測試
運行AopApplication, 然后訪問http://localhost:8080/test?p1=123,可以看到控制臺有以下輸出:
before log1 at: 1554903984403
print log 1123 com.example.aop.dto.TestDomain@2a7a4cd5
around log1 at: 1554903984402
after log1 at: 1554903984409
after returning log1 at: 1554903984409
before log2 at: 1554903984409
print log 2123 com.example.aop.dto.TestDomain@2a7a4cd5
around log2 at: 1554903984409
after log2 at: 1554903984410
after returning log2 at: 1554903984410
before throwException at: 1554903984410
throw exception
after throwException at: 1554903984410
after throwing throwException at: 1554903984410
github地址:https://github.com/lijun003/SpringBoot-AOP-log
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。