AOP的动态代理机制

在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。

代理模式的设计思想:是通过代理的方式避免暴露被代理对象或者说代理不容易被取得的对象

public class CalculatorProxy {

    /**
     * 为传入的参数对象创建一个动态代理对象
     * @param calculator 参数对象
     * @return 动态代理对象
     */
    public static Object getProxy(final Calculator calculator){
        /*
         * Proxy:为目标对象创建代理对象;相当于Proxy也是实现了Calculator接口
         *
         * 参数
         * loader:目标对象的类加载器
         * interfaces:目标对象实现的所有接口;如果没有实现任何接口,就会报错
         * InvocationHandler:方法执行器对象
         */
        return Proxy.newProxyInstance(calculator.getClass().getClassLoader(), calculator.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *
             * @param proxy 代理对象;给jdk使用。任何时候都不要动这个对象
             * @param method 当前将要执行的目标对象的方法
             * @param args 这个方法调用时外界传入的参数值
             * @return 真正执行后的返回值
             * @throws Throwable 代理异常
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //利用反射执行目标对象的方法
                Object result = null;
                try{
                    LogUtils.logStart(method,args);
                    result = method.invoke(calculator,args);
                    LogUtils.logReturn(method,result);
                }catch (Exception e){
                    LogUtils.logException(method,e);
                }finally {
                    LogUtils.logEnd(method);
                }
                return result;
            }
        });
    }
}

以下的类就可以对目标对象进行需要的操作

public class LogUtils {
    

    public static void logStart(Method method, Object[] args) {
        System.out.println("【"+method.getName()+"】方法开始执行,用的参数列表【"+ Arrays.asList(args)+"】");
    }

    public static void logReturn(Method method, Object result) {
        System.out.println("【"+method.getName()+"】方法正常执行完成,结果是:"+result);
    }

    public static void logException(Method method, Exception e) {
        System.out.println("【"+method.getName()+"】方法执行出现异常了,异常信息是:"+e.getCause()+";这个异常已经通知测试小组进行排查");
    }

    public static void logEnd(Method method) {
        System.out.println("【"+method.getName()+"】方法最终结束了");
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring AOP动态代理是实现AOP的一种方式。Spring AOP使用了Java的动态代理机制来创建代理对象,并将切面逻辑织入到目标对象的方法调用动态代理是在运行时生成代理对象的一种机制。它不需要在编写代码时就确定要代理的类和方法,而是在运行时根据需要创建代理对象。在Spring AOP,主要有两种类型的动态代理:基于接口的代理和基于类的代理。 1. 基于接口的代理(JDK动态代理):当目标对象实现了至少一个接口时,Spring AOP会使用JDK动态代理来生成代理对象。JDK动态代理通过实现目标对象所实现的接口来生成代理对象,在调用代理对象的方法时,会通过InvocationHandler接口将方法调用转发给实际的目标对象。 2. 基于类的代理(CGLIB动态代理):当目标对象没有实现任何接口时,Spring AOP会使用CGLIB动态代理来生成代理对象。CGLIB动态代理通过继承目标对象生成一个子类,并覆盖其的方法来实现代理。调用代理对象的方法时,会先进入子类的方法,然后再调用目标对象的方法。 使用动态代理可以实现对目标对象的拦截和增强,而不需要修改目标对象的源代码。代理对象可以在目标对象的方法执行前、执行后或执行过程插入额外的逻辑,例如日志记录、性能统计、事务管理等。 需要注意的是,动态代理只能对公共方法进行拦截,对私有方法、静态方法或final方法无法进行拦截。同时,动态代理也只能拦截通过代理对象调用的方法,直接通过目标对象调用方法时无法实现拦截和增强。 总结来说,Spring AOP使用动态代理来实现切面逻辑的织入,可以通过JDK动态代理或CGLIB动态代理来生成代理对象,并将切面逻辑应用到目标对象的方法调用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值