動態代理就是能夠任意的控制任意對象的執行過程,意思就是說這個對象的執行過程能夠由客戶端靈活的指定,可能這樣說仍是不太明確,通俗說就是java
原本應該本身作的事情,由於沒有某種緣由不能直接作,只能請別人代理作。被請的人就是代理。好比咱們須要個妹子,而咱們本身找太麻煩了,就能夠找我的幫你找妹子。通俗的將就是在調用實現類的方法時,能夠在方法執行先後作額外的工做,這個就是代理。spring
先來個找妹的接口ide
public interface DynamicDao {
/** * 找妹子 */
void forSister();
}
複製代碼
再寫一個找妹實現類來實現這個接口,這個實現類就是咱們要代理的對象this
public class DynamicDaoImpl implements DynamicDao {
@Override
public void forSister() {
System.out.println("找妹子");
System.out.println("發現萌妹");
System.out.println("跟妹子要聯繫方法");
}
}
複製代碼
再新建個Handler(幫找妹子的人) 這個類必須繼承InvocationHandler接口spa
處理類(即可以作額外工做的類):3d
public class MediationHandle implements InvocationHandler {
/** * 持有被代理對象的引用(此引用能夠有外部靈活制定的) */
private Object target;
public MediationHandle(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("去妹子出現率高的場合");
method.invoke(target, args);
System.out.println("把聯繫方式給僱主");
return null;
}
}
複製代碼
找妹子的人有了 如何讓他去幫我們找妹子呢? 實現以下代理
public class DynamicProxyTest {
@Test
public void testProxy() {
// 須要代理的對象
DynamicDao dynamicDao=new DynamicDaoImpl();
//建立一個幫找妹子的人 指定找妹子的實現
MediationHandle handle = new MediationHandle(dynamicDao);
// 建立代理 handle+proxy才能實現動態代理(反射的方式)
DynamicDao dynamicDaoProxy= (DynamicDao) Proxy.newProxyInstance(
dynamicDao.getClass().getClassLoader(),
dynamicDao.getClass().getInterfaces(),
handle
);
//開始找妹子
dynamicDaoProxy.forSister();
}
}
複製代碼
打印的值code
去妹子出現率高的場合
找妹子
發現萌妹
跟妹子要聯繫方法
把聯繫方式給僱主
複製代碼
好了,這就實現了動態代理,spring中的Aop默認也是基於這種方式 須要配置攔截的方法cdn
spring Aop 還提供了另外一種方式來實現動態代理 Cglib 下篇再講對象