Spring總結七:AOP動態代理的實現
阿新 • • 發佈:2018-07-14
product div image style 攔截 throwable eth oid void
Spring中的AOP代理可以使JDK動態代理,也可以是CGLIB代理,前者基於接口,後者基於子類。
首先我們來用代碼簡單演示jdk動態代理:
現在有一個商品的增刪改查的操作
/** * 商品操作接口 */ public interface ProductService { public void add(); public void edit(); public void delte(); public void select(); } /** * 實現類 */ public class ProductServiceImpl implementsProductService { @Override public void add() { System.out.println("添加商品"); } @Override public void edit() { System.out.println("修改商品"); } @Override public void delte() { System.out.println("刪除商品"); } @Override publicvoid select() { System.out.println("查詢商品"); } }
我們編寫一個基於jdk的動態代理(實現InvocationHandler接口):
public class JdkProxy implements InvocationHandler { //被代理的目標 private Object target; //構造函數 傳入目標對象 public JdkProxy(Object target) { this.target = target; }//提供創建代理對象的方法 public Object createProxy() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * 實現InvocationHandler接口的回調方法, 攔截目標對象所有方法都會執行invoke方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("我是代理,我對被代理的目標有絕對的控制權..."); Object returnVal = method.invoke(target, args); System.out.println("--------------------------------------"); return returnVal; } }
測試代碼:
public class JdkProxyTest { @Test public void testJdkProxy() { //創建對象 ProductService target = new ProductServiceImpl(); //創建代理對象 JdkProxy jdkProxy = new JdkProxy(target); //代理面向接口 ProductService proxy = (ProductService) jdkProxy.createProxy(); //通過代理調用方法 proxy.add(); proxy.edit(); proxy.delte(); proxy.select(); } }
運行結果:
Spring總結七:AOP動態代理的實現