一、AOP
目前創(chuàng)新互聯(lián)建站已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站運營、企業(yè)網(wǎng)站設(shè)計、尋烏網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。 AOP是OOP的延續(xù),是軟件開發(fā)中的一個熱點,也是Spring框架中的一個重要內(nèi)容,是函數(shù)式編程的一種衍生范型。
二、實現(xiàn)
引入依賴
<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
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
文章名稱:使用SpringBoot+AOP實現(xiàn)可插拔式日志的示例代碼
當(dāng)前地址:http://bm7419.com/article24/igsdce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、移動網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站改版、手機(jī)網(wǎng)站建設(shè)、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)