Spring框架 第3章 AOP前奏

第3章 AOP前奏?

3.1 提出問題

3.1.1 情景:數(shù)學(xué)計(jì)算器 ?

  • 要求

①執(zhí)行加減乘除運(yùn)算

②日志:在程序執(zhí)行期間追蹤正在發(fā)生的活動(dòng)

③驗(yàn)證:希望計(jì)算器只能處理正數(shù)的運(yùn)算

? 2) 常規(guī)實(shí)現(xiàn)

?? ?3)? 問題

①代碼混亂:越來越多的非業(yè)務(wù)需求(日志和驗(yàn)證等)加入后,原有的業(yè)務(wù)方法急劇膨脹。每個(gè)方法在處理核心邏輯的同時(shí)還必須兼顧其他多個(gè)關(guān)注點(diǎn)。

②代碼分散: 以日志需求為例,只是為了滿足這個(gè)單一需求,就不得不在多個(gè)模塊(方法)里多次重復(fù)相同的日志代碼。如果日志需求發(fā)生變化,必須修改所有模塊。

3.2 動(dòng)態(tài)代理

3.2.1 動(dòng)態(tài)代理的原理

代理設(shè)計(jì)模式的原理:使用一個(gè)代理將對(duì)象包裝起來,然后用該代理對(duì)象取代原始對(duì)象。任何對(duì)原始對(duì)象的調(diào)用都要通過代理。代理對(duì)象決定是否以及何時(shí)將方法調(diào)用轉(zhuǎn)到原始對(duì)象上。

3.2.2 動(dòng)態(tài)代理的方式

  • 基于接口實(shí)現(xiàn)動(dòng)態(tài)代理: JDK動(dòng)態(tài)代理
  • 基于繼承實(shí)現(xiàn)動(dòng)態(tài)代理: Cglib、Javassist動(dòng)態(tài)代理

3.3 數(shù)學(xué)計(jì)算器的改進(jìn)

3.3.1 日志處理器

?

3.3.2 驗(yàn)證處理器

3.3.3 測(cè)試代碼

3.3.4 保存生成的動(dòng)態(tài)代理類

?在測(cè)試方法中加入如下代碼:

?Properties properties = System.getProperties();

?properties.put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");