1. 程式人生 > >Spring(AOP靜態代理)

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呼叫方法,讓程式碼很好的實現了可擴充套件性,也不用在原來已有的程式碼上修改。

靜態代理的缺點:只能針對一個介面進行代理