Spring(AOP靜態代理)
對於AOP 我們應該拿OOP來對比學習,它們之間的區別如下:
AOP中不得不提的就是代理:
通俗理解就是:茅臺公司生產出酒,而代理商拿出來銷售並推出各種銷售活動。這時茅臺公司就是真實主題,也就是目標物件。而代理商就是代理。茅臺酒就是目標物件中的方法。各種銷售活動就是給目標物件中的方法的增強補充,比如對方法新增日誌等等操作。
代理又分為靜態代理和動態代理兩種:像這樣已知目標物件就是為茅臺公司 就為靜態代理,這時目標物件已確定
下面為一個靜態代理的例子:
先定義一個PersonBiz的介面:
再對這個介面進行實現
這是我們使用靜態代理給這兩個方法加上一個操作時間的功能,我就直接上程式碼了:
package com.yc.dao.impl;
import java.util.Date;
import com.yc.dao.PersonBiz;
//代理物件
public class PersonBizProxy implements PersonBiz {
private PersonBiz personBiz;// 對真實主題的引用
public PersonBizProxy(PersonBiz personBiz) {
this.personBiz = personBiz;
}
@Override
public void add(String name) {
// 加入關注點-》增強的功能
showLog();// 前置增強
// 再呼叫真實主題的方法
this.personBiz.add(name);
}
@Override
public String find() {
// 呼叫真實主題的方法
personBiz.find();
// 加入關注點-》增強的功能
showLog();// 後置增強
return null;
}
private void showLog() {
Date d = new Date();
System.out.println("-----------------");
System.out.println("操作時間" + d);
System.out.println("-----------------");
}
}
最後就是測試類:
代理的優勢很明顯:當你不需要新增的操作時間的功能時,就將PersonBizProxy pbp=new PersonBizProxy(pb);去掉即可,後面改用pb呼叫方法,讓程式碼很好的實現了可擴充套件性,也不用在原來已有的程式碼上修改。
靜態代理的缺點:只能針對一個介面進行代理