1. 建立一個接口ide
public interface UserService { void save(); void delete(); void update(); void find(); }
2.建立一個接口的實現類測試
public class UserServiceImpl implements UserService { @Override public void save() { System.out.println("保存用戶!"); //int i = 1/0; } @Override public void delete() { System.out.println("刪除用戶!"); } @Override public void update() { System.out.println("更新用戶!"); } @Override public void find() { System.out.println("查找用戶!"); } }
介紹下爲何要使用動態代理.由於接口實現類中,這4個方法都執行的時候 想調用同一個方法.可是寫4次就有點不符合設計.this
因此使用動態代理 只寫一次就能夠了spa
3.建立動態代理的類設計
public class UserServiceProxyFactory implements InvocationHandler { public UserServiceProxyFactory(UserService us) { super(); this.us = us; } private UserService us; public UserService getUserServiceProxy(){ //生成動態代理 UserService usProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), this); //返回 return usProxy; } @Override public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable { System.out.println("打開事務!"); Object invoke = method.invoke(us, arg2); System.out.println("提交事務!"); return invoke; } }
4.測試動態代理代理
@Test //動態代理 public void fun1(){ UserService us = new UserServiceImpl(); UserServiceProxyFactory factory = new UserServiceProxyFactory(us); UserService usProxy = factory.getUserServiceProxy(); usProxy.save(); //代理對象與被代理對象實現了相同的接口 //代理對象 與 被代理對象沒有繼承關係 System.out.println(usProxy instanceof UserServiceImpl );//false }