打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Spring AOP 本质系列之动态代理
Spring AOP 本质系列之动态代理
 
Spring 的AOP核心技术还是动态代理,Spring的代理实现方式有两种,默认使用CGLIB,也可以选择使用JDK的代理,这一切对开发人员来说是透明的,可以不关心这些。
 
但是,Spring实在是太强了,太吸引人了,以至于不得不研读其底层的API实现。
 
Spring代理生成的过程还是和JDK有一定区别的,经过研读分析Spring AOP底层源码,画出了其原理图。并且为了对比JDK的动态代理的实现,也给出JDK动态代理原理图。
 
 
下面,给出个JDK实现动态代理的例子,Spring的例子在AOP本质系列中比比皆是,故此不再给出。
 
/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-9 14:16:18<br>
* <b>Note</b>: 目标抽象接口
*/

public interface ITarget {
    public void doSomething();
}

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-9 14:17:03<br>
* <b>Note</b>: 目标类
*/

public class Target implements ITarget {

    public void doSomething() {
        System.out.println(">>>正在调用Targer.doSomething()方法!");
    }
}

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-9 14:23:07<br>
* <b>Note</b>: 代理处理器实现
*/

public class MyInvocationHandler implements InvocationHandler {
    private Target target;

    public MyInvocationHandler(Object obj) {
        target = (Target) obj;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(">>>代理处理器start...");
        Object result = method.invoke(target, args);
        System.out.println(">>>代理处理器end...");
        return result;
    }
}


import java.lang.reflect.Proxy;

/**
* Created by IntelliJ IDEA.<br>
* <b>User</b>: leizhimin<br>
* <b>Date</b>: 2008-5-9 14:27:20<br>
* <b>Note</b>: 客户端
*/

public class Test {
    public static void main(String args[]) {
        //创建目标对象
        Target target = new Target();
        //创建代理实例调用处理程序(相当于SpringAOP中切面)
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(target);
        //通过Proxy生成一个代理对象obj,obj可以宣称实现了目标对象所实现的接口ITarget
        ITargetproxyTarget = (ITarget)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), myInvocationHandler);
        //从代理对象上调用目标对象的方法
        proxyTarget.doSomething();
    }
}
 
运行结果:
>>>代理处理器start...
>>>正在调用Targer.doSomething()方法!
>>>代理处理器end...

Process finished with exit code 0
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
漫画|Spring AOP的底层原理是什么?
Spring AOP
SPRING AOP杂记
用代码学习Spring:IoC、AOP
Java实现AOP的几种方式
Java轻量级业务层框架Spring两大核心IOC和AOP原理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服