最近在看spring aop的內容,在這作個筆記。 1、介紹 一、瞭解編程範式: (1)面向過程編程:C語言 (2)面向對象編程:Java、C++ (3)函數式編程 (4)事件驅動編程:GUI (5)面向切面編程:AOPphp
二、AOP是什麼? 是一種編程方式,不是編程語言。 解決特定問題,不是全部問題 aop是面向對象編程的補充c++
三、Aop初衷: DRY:Don’t repeat yourself 不用重複代碼 SoC:Separation of Concenrns 關注點分離 水平分離:展現層、服務層、持久層 垂直分離:模塊劃分(訂單、庫存) 切面分離:分離功能性需求和非功能性需求spring
四、Aop好處: 集中處理管理某一關注點/橫切邏輯 能夠很方便添加、刪除關注點 侵入性少,加強代碼可讀性以及維護性編程
五、Aop應用場景 權限控制 緩存控制 事務控制 審計日誌 性能監控 分佈式追蹤 異常處理緩存
六、支持AOP的編程語言:Java、 .net.、 c/c++、 ruby、Python 、php等等,包括面嚮對象語言,也包括腳本語言ruby
2、AOP的簡單實現 主要步驟有: (1)引入aop maven 依賴; (2)編寫切面代碼(主要用到@Aspect、@Pointcut和通知註解); (3)編寫單元測試,運行。maven
主要代碼: 一、maven依賴:編程語言
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
二、業務邏輯類:分佈式
@Service public class ProductService{ public void saveProduct() { System.out.println("save product now ……"); } public void deleteProduct() { System.out.println("delete product now ……"); } public void deleteProduct_throwWrong() throws Exception { System.out.println("delete product and throw exception now ……"); throw new Exception(); } }
三、切面類:函數式編程
@Aspect @Component public class AspectTest { @Pointcut("within(cn.exercise.service.impl.ProductService)") public void adminOnly() { } @Before("adminOnly()") public void before() { System.out.println("------------ @Aspect ###before"); } // @After("adminOnly()") // public void after() { // System.out.println("------------ @Aspect ###after"); // } // @AfterReturning("adminOnly()") // public void afterReturning() { // System.out.println("------------ @Aspect ###afterReturning"); // } // @AfterThrowing("adminOnly()") // public void after() { // System.out.println("------------ @Aspect ###afterThrowing"); // } // @Around("adminOnly()") // public void Around(ProceedingJoinPoint joinPoint) { // System.out.println("------------ @Aspect ###around--before"); // try { // joinPoint.proceed(); // } catch (Throwable e) { // System.out.println("------------ @Aspect ###around--throwable"); // } finally { // System.out.println("------------ @Aspect ###around--after"); // } // System.out.println("------------ @Aspect ###around--last"); // } }
四、單元測試類
@RunWith(SpringRunner.class) @SpringBootTest public class AopTestApplicationTests { @Autowired private ProductService productServie; @Test public void contextLoads() throws Exception { productServie.saveProduct(); // productServie.deleteProduct(); // productServie.deleteProduct_throwWrong(); } }