歡迎訪問昆山寶鼎軟件有限公司網站! 設為首頁 | 網站地圖 | XML | RSS訂閱 | 寶鼎郵箱 | 后臺管理
?

探灵笔记改人物等级:新聞資訊

MENU

軟件開發知識
原文出處: 我叫劉半仙

探灵笔记小皮美颜版 www.pfyvo.icu 為什么會有面向切面編程(AOP)?我們知道Java是一個面向工具(OOP)的語言,但它有一些漏洞,好比當我們需要為多個不具有擔任干系的工具引入一個民眾行為,譬喻日志、權限驗證、事務等成果時,只能在在每個工具里引用民眾行為。這樣做未便于維護,并且有大量反復代碼。AOP的呈現補充了OOP的這點不敷。

為了敘述清楚Spring AOP,我們從將以下方面舉辦接頭:

  1. 署理模式
  2. 靜態署理道理及實踐
  3. 動態署理道理及實踐
  4. Spring AOP道理及實戰

1. 署理模式

署理模式:為其他工具提供一種署理以節制對這個工具的會見。這段話較量官方,但我更傾向于用本身的語言領略:好比A工具要做一件工作,在沒有署理前,本身來做;在對 A 署理后,由 A 的署理類 B 來做。署理其實是在原實例前后加了一層處理懲罰,這也是 AOP 的低級表面。

2. 靜態署理道理及實踐

靜態署理模式:靜態署理說白了,勞務派遣管理系統,昆山軟件開發,就是在措施運行前就已經存在署理類的字節碼文件、署理類和原始類的干系在運行前就已經確定??棧安歡嗨?,我們看一下代碼。為了利便閱讀,博主把單獨的 class 文件歸并到接口中,讀者可以直接復制代碼運行:

package test.staticProxy;

// 接口
public interface IUserDao {
    void save();
    void find();
}

//方針工具
class UserDao implements IUserDao{
    @Override
    public void save() {
        System.out.println("模仿:生存用戶!");
    }
    @Override
    public void find() {
        System.out.println("模仿:查詢用戶");
    }
}

/**
  * 靜態署理
  * 特點:
  * 2. 方針工具必需要實現接口
  * 2. 署理工具,要實現與方針工具一樣的接口
 */
class UserDaoProxy implements IUserDao{

    // 署理工具,需要維護一個方針工具
    private IUserDao target = new UserDao();

    @Override
    public void save() {
        System.out.println("署理操縱: 開啟事務...");
        target.save();   // 執行方針工具的要領
        System.out.println("署理操縱:提交事務...");
    }

    @Override
    public void find() {
        target.find();
    }
}

測試功效:

頁面轉發等等成果  <a href=蘇州軟件定制開拓 博主一小我私家的氣力有限" class="aligncenter size-full wp-image-31321" title="aop-1" src="/uploads/allimg/c190113/154I2350ZKF-14058.png" />

靜態署理固然擔保了業務類只需存眷邏輯自己,署理工具的一個接口只處事于一種范例的工具。假如要署理的要領許多,勢須要為每一種要領都舉辦署理。再者,假如增加一個要領,除了實現類需要實現這個要領外,所有的署理類也要實現此要領。增加了代碼的維護本錢。那么要如何辦理呢?謎底是利用動態署理。

3. 動態署理道理及實踐

動態署理模式:動態署理類的源碼是在措施運行期間,通過 JVM 反射等機制動態生成。署理類和委托類的干系是運行時才確定的。實譬喻下:

package test.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 接口
public interface IUserDao {
    void save();
    void find();
}

//方針工具
class UserDao implements IUserDao{

    @Override
    public void save() {
        System.out.println("模仿: 生存用戶!");
    }

    @Override
    public void find() {
        System.out.println("查詢");
    }
}

/**
 * 動態署理:
 * 署理工場,給多個方針工具生成署理工具!
 *
 */
class ProxyFactory {

    // 吸收一個方針工具
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    // 返回對方針工具(target)署理后的工具(proxy)
    public Object getProxyInstance() {
        Object proxy = Proxy.newProxyInstance(
            target.getClass().getClassLoader(),  // 方針工具利用的類加載器
            target.getClass().getInterfaces(),   // 方針工具實現的所有接口
            new InvocationHandler() {            // 執行署理工具要領時候觸發

                @Override
                public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {

                    // 獲取當前執行的要領的要領名
                    String methodName = method.getName();
                    // 要領返回值
                    Object result = null;
                    if ("find".equals(methodName)) {
                        // 直接挪用方針工具要領
                        result = method.invoke(target, args);
                    } else {
                        System.out.println("開啟事務...");
                        // 執行方針工具要領
                        result = method.invoke(target, args);
                        System.out.println("提交事務...");
                    }
                    return result;
                }
            }
        );
        return proxy;
    }
}

測試功效如下: