1. 程式人生 > 其它 >Spring5----複習筆記4

Spring5----複習筆記4

今天繼續更新我們的spring5複習筆記。

今天介紹AOP概念。

首先來介紹一下什麼是AOP:

這裡我舉了個例子,比如我們在普通的使用者登入板塊,如果我們想要新增一些特殊的功能時,比如判斷這個使用者是管理員還是普通會員,如果我們一開始沒有加這個功能,那我們想加入功能時就要修改我們的邏輯判斷程式碼,這就破壞了設計模式中的封閉開放原則,是一種不好的修改方法。

但是如果我們引入了AOP,就可以解決這個問題了,我們可以在原有方法的基礎上增加功能,不修改原有的程式碼也能實現功能的新增。

其實AOP底層採用了代理模式,接下來我將展示jdk的動態代理。

我們可以發現當我們實現jdk的動態代理時,需要寫一個介面,並用實現類實現這個介面。

介面:

public interface UserDao {
    public int add(int a,int b);

    public String update(String id);
}

實現類:

public class UserDaoImpl implements UserDao{
    @Override
    public int add(int a, int b) {
        return a + b;
    }

    @Override
    public String update(String id) {
        return
id; } }

代理物件程式碼:

//建立代理物件程式碼
class UserDaoProxy implements InvocationHandler{

    //1.把建立的是誰的代理物件,把誰傳遞來
    //有參構造進行傳遞
    Object obj;

    public UserDaoProxy(Object obj){
        this.obj = obj;
    }


    //增強的邏輯
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable { //方法之前 System.out.println("在方法之前執行:" + method.getName() + " 傳遞的引數..." + Arrays.toString(args)); //被增強的方法需要執行 Object res = method.invoke(obj, args); System.out.println("原方法的返回值 : " + res); //方法之後 System.out.println("方法執行之後 : " + obj); return res; } }

客戶端呼叫:

public static void main(String[] args) {
        //建立介面實現類的代理方法
        Class[] interfaces = {UserDao.class};
        UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(new UserDaoImpl()));

        int res = dao.add(1, 2);
        System.out.println(res);
        System.out.println("*********************8*****************");
        String update = dao.update("123");

        System.out.println(update);
    }

我們在建立代理類物件的時候需要