Spring框架 第3章 AOP前奏
第3章 AOP前奏?
3.1 提出問(wèn)題
3.1.1 情景:數學(xué)計算器 ?
- 要求
①執行加減乘除運算
②日志:在程序執行期間追蹤正在發(fā)生的活動(dòng)
③驗證:希望計算器只能處理正數的運算
? 2) 常規實(shí)現
?? ?3)? 問(wèn)題
①代碼混亂:越來(lái)越多的非業(yè)務(wù)需求(日志和驗證等)加入后,原有的業(yè)務(wù)方法急劇膨脹。每個(gè)方法在處理核心邏輯的同時(shí)還必須兼顧其他多個(gè)關(guān)注點(diǎn)。
②代碼分散: 以日志需求為例,只是為了滿(mǎn)足這個(gè)單一需求,就不得不在多個(gè)模塊(方法)里多次重復相同的日志代碼。如果日志需求發(fā)生變化,必須修改所有模塊。
3.2 動(dòng)態(tài)代理
3.2.1 動(dòng)態(tài)代理的原理
代理設計模式的原理:使用一個(gè)代理將對象包裝起來(lái),然后用該代理對象取代原始對象。任何對原始對象的調用都要通過(guò)代理。代理對象決定是否以及何時(shí)將方法調用轉到原始對象上。
3.2.2 動(dòng)態(tài)代理的方式
- 基于接口實(shí)現動(dòng)態(tài)代理: JDK動(dòng)態(tài)代理
- 基于繼承實(shí)現動(dòng)態(tài)代理: Cglib、Javassist動(dòng)態(tài)代理
3.3 數學(xué)計算器的改進(jìn)
3.3.1 日志處理器
?
3.3.2 驗證處理器
3.3.3 測試代碼
3.3.4 保存生成的動(dòng)態(tài)代理類(lèi)
?在測試方法中加入如下代碼: ?Properties properties = System.getProperties(); ?properties.put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); |