spring-AOP動態代理
阿新 • • 發佈:2017-10-18
uid turn ret tin ava span pl2 () expand
動態代理 的四個步驟:
-
-
通過為 Proxy 類指定 ClassLoader 對象和一組 interface 來創建動態代理類;
-
通過反射機制獲得動態代理類的構造函數,其唯一參數類型是調用處理器接口類型;
-
通過構造函數創建動態代理類實例,構造時調用處理器對象作為參數被傳入
1 package com.yztc.aop; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 importjava.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動態代理