1. 程式人生 > >spring-AOP動態代理

spring-AOP動態代理

uid turn ret tin ava span pl2 () expand

動態代理 的四個步驟:

  1. 通過實現 InvocationHandler 接口創建自己的調用處理器;

  2. 通過為 Proxy 類指定 ClassLoader 對象和一組 interface 來創建動態代理類;

  3. 通過反射機制獲得動態代理類的構造函數,其唯一參數類型是調用處理器接口類型;

  4. 通過構造函數創建動態代理類實例,構造時調用處理器對象作為參數被傳入

 1 package com.yztc.aop;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 import
java.lang.reflect.Proxy; 6 7 public class AccountProxy implements InvocationHandler { 8 //代理目標對象 9 private Object target; 10 public Object newProxyInstance(Object object){ 11 this.target= object; 12 return 13 Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this
); 14 15 } 16 17 18 @Override 19 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 20 System.out.println("start---->代理類開始工作!!"); 21 for (int i = 0; i < args.length; i++) { 22 System.out.println(args[i]); 23 24 }
25 //在執行核心方法之前使用能夠調用公共的操作 26 System.out.println("調用核心方法之前"); 27 //要執行的核心方法 28 Object invoke = method.invoke(target, args); 29 System.out.println("調用核心方法之後"); 30 return invoke; 31 } 32 33 }
1 package com.yztc.aop;
2 
3 public interface IAccountDao {
4     void add(String name);
5     void delete(String uid);
6 }
 1 package com.yztc.aop;
 2 
 3 public class AccountDaoImpl implements IAccountDao {
 4 
 5     @Override
 6     public void add(String name) {
 7         System.out.println("add:==="+name);
 8     }
 9 
10     @Override
11     public void delete(String uid) {
12         System.out.println("delete"+uid);
13     }
14 
15 }
 1 package com.yztc.aop;
 2 
 3 import com.yztc.aop.bean.AccountDaoImpl2;
 4 import com.yztc.aop.bean.CglibProxy;
 5 
 6 public class TestMain {
 7     public static void main(String[] args) {
 8         IAccountDao accountDao = (IAccountDao) new AccountProxy().newProxyInstance(new AccountDaoImpl());
 9         accountDao.add("xiaoming");
10         accountDao.delete("1");
11 }

spring-AOP動態代理