<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 1. AOP原理 1. 將復雜的需求分解出不同方面,將散布在系統中的公共功能集中解決,如常用的日志、事務管理、權限管理等。 2. 采用代理機制組裝成起來運行,在不改變原程序的基礎上對代碼進行增強處理,添加新的功能。 在 Spring 中 AOP 代理使用 JDK 動態代理或 CGLIB 動態代理來實現,如果目標對象是接口,則默認采用JDK 動態代理,否則使用 CGLIB 代理。 (1)JDK動態代理 ```java // 基于接口實現的代理為JDK動態代理 public interface UserDao {...} public class UserDaoImpl implements UserDao {...} ``` (2)CGLIB動態代理 ```java // 基于類實現的代理為CGLIB動態代理 public class People{ ... } public Persion extends People{...} ``` <br/> # 2. JDK動態代理演示 案例代碼:https://gitee.com/flymini/codes01/tree/master/spring_/com-learn-spring05 **** 步驟如下: **1. 創建接口** ```java public interface UserDao { public int add(int a,int b); } ``` **2. 實現接口** ```java public class UserDaoImpl implements UserDao { @Override public int add(int a, int b) { return a + b; } } ``` **3. 創建代理對象** ```java public class JdkDynamicProxy implements InvocationHandler { private Object obj; public JdkDynamicProxy(Object obj) { this.obj = obj; } /** * 增強邏輯:在invoke方法中,你可以決定在被代理對象的目標方法執行之前或之后自由決定做你想要的處理。 * * @param proxy 需要被代理的對象 * @param method 當前被代理對象正在被調用的方法 * @param args 被代理對象方法的參數 */ @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("方法之后執行:" + obj); return res; } } ``` **4. 測試** ```java public class JdkDynamicProxyTest { /** * 寫法一 */ @Test public void proxyTest1() { Class[] interfaces = {UserDao.class}; UserDaoImpl userDaoImpl = new UserDaoImpl(); //使用代理創建UserDao接口的一個對象 UserDao userDao = (UserDao) Proxy.newProxyInstance(JdkDynamicProxyTest.class.getClassLoader(), interfaces, new JdkDynamicProxy(userDaoImpl)); int result = userDao.add(1, 2); System.out.println("輸出結果:" + result); } /** * 寫法二 */ @Test public void proxyTest2() { Class[] interfaces = {UserDao.class}; UserDaoImpl userDaoImpl = new UserDaoImpl(); UserDao userDao = (UserDao) Proxy.newProxyInstance(JdkDynamicProxyTest.class.getClassLoader(), interfaces, (proxy, method, args) -> { //方法之前 System.out.println("方法之前執行:" + method.getName() + ",傳遞的參數:" + Arrays.toString(args)); //被增強的方法執行 Object res = method.invoke(userDaoImpl, args); //方法之后 System.out.println("方法之后執行:" + userDaoImpl); return res; }); int result = userDao.add(1, 2); System.out.println("輸出結果:" + result); } } ``` 結果如下: ``` 方法之前執行:add,傳遞的參數:[1, 2] 方法之后執行:com.learn.spring05.dao.impl.UserDaoImpl@4f8e5cde 輸出結果:3 ``` 執行的順序應該如下: ``` 遇到語句 int result = userDao.add(1, 2); 但還沒有執行 --> 執行 invoke 方法 --> 執行 System.out.println("方法之前執行:" + method.getName() + ",傳遞的參數:" + Arrays.toString(args)); --> 這個時候才執行 userDao.add方法:Object res = method.invoke(obj, args); --> 執行System.out.println("方法之后執行:" + obj); ``` 結論:通過代理可以選擇在執行目標方法之前或之后做我們想要的邏輯處理,相當于在目標函數的前面或后面插了一腳,實現了切面編程思想。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看