當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring-AOP动态代理技术(底层代码)
生活随笔
收集整理的這篇文章主要介紹了
Spring-AOP动态代理技术(底层代码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.JDK代理:基于接口的動態代理技術
目標對象必須有接口,目標對象有什么方法,目標接口就有什么方法,
運行期間基于接口動態生成代理對象,所以代理對象也就有目標對象同樣的方法。
注意:以下代碼只是底層jdk動態代理實現的方式,我們在開發過程中只需要在配置文件中進行配置即可,這些代碼spring會幫你自動生成(這是模擬底層)
(1)創建接口及其實現類
public interface TargetInterface {public void save(); } public class Target implements TargetInterface{@Overridepublic void save() {System.out.println("save running....");} }(2)創建增強的方法
public class Advice {public void before(){System.out.println("前置增強");}public void after(){System.out.println("后置增強");} }(3)測試實現
public class ProxyTest {public static void main(String[] args) {//目標對象final Target target=new Target();//增強對象final Advice advice=new Advice();TargetInterface proxy= (TargetInterface) Proxy.newProxyInstance(//目標對象類加載器target.getClass().getClassLoader(),//目標對象相同的接口字節碼對象數組target.getClass().getInterfaces(),//調用代理對象的任何方法,實質執行的都是invoke方法new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {advice.before();//前置增強//執行目標方法Object invoke = method.invoke(target, args);advice.after(); //后置增強return invoke;}});//調用代理方法proxy.save();} }2.cglib代理:基于父類的動態代理技術
基于目標對象動態生成一個代理對象,類似于繼承(但不是繼承),代理對象內部調用目標對象,在調用目標對象之前或者之后介入一些其他代碼,從而完成的增強。
(1)創建目標對象類
(2)創建增強類
public class Advice {public void before(){System.out.println("前置增強");}public void after(){System.out.println("后置增強");} }3.底層實現
public class ProxyTest {public static void main(String[] args) {//目標對象final Target target=new Target();//增強對象final Advice advice=new Advice();//返回值 就是動態生成的代理對象,基于cglib//1.創建增強器Enhancer enhancer=new Enhancer();//2.設置父類(目標對象)enhancer.setSuperclass(Target.class);//3.設置回調enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {advice.before(); //執行前置Object invoke = method.invoke(target, objects);advice.after(); //執行后置return invoke;}});//4.生成代理對象Target proxy= (Target) enhancer.create();proxy.save();} }結果:
前置增強
save running…
后置增強
總結
以上是生活随笔為你收集整理的Spring-AOP动态代理技术(底层代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-AOP底层实现
- 下一篇: Spring-aop注解开发(切点表达式