Spring5----複習筆記4
阿新 • • 發佈:2021-09-29
今天繼續更新我們的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) { returnid; } }
代理物件程式碼:
//建立代理物件程式碼 class UserDaoProxy implements InvocationHandler{ //1.把建立的是誰的代理物件,把誰傳遞來 //有參構造進行傳遞 Object obj; public UserDaoProxy(Object obj){ this.obj = obj; } //增強的邏輯 @Override public Object invoke(Object proxy, Method method, Object[] args) throwsThrowable { //方法之前 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); }
我們在建立代理類物件的時候需要