Spring总结七:AOP动态代理的实现

Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。

首先我们来用代码简单演示jdk动态代理:

现在有一个商品的增删改查的操作

/**
 * 商品操作接口
 */
public interface ProductService {
    public void add();
    public void edit();
    public void delte();
    public void select();
}

/**
 * 实现类
 */
public class ProductServiceImpl implements ProductService {
    @Override
    public void add() {
        System.out.println("添加商品");
    }

    @Override
    public void edit() {
        System.out.println("修改商品");
    }

    @Override
    public void delte() {
        System.out.println("删除商品");
    }

    @Override
    public void select() {
        System.out.println("查询商品");
    }
}

我们编写一个基于jdk的动态代理(实现InvocationHandler接口):

public class JdkProxy implements InvocationHandler {

    //被代理的目标
    private Object target;

    //构造函数 传入目标对象
    public JdkProxy(Object target) {
        this.target = target;
    }

    //提供创建代理对象的方法
    public Object createProxy() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    /**
     * 实现InvocationHandler接口的回调方法, 拦截目标对象所有方法都会执行invoke方法
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("我是代理,我对被代理的目标有绝对的控制权...");
        Object returnVal = method.invoke(target, args);
        System.out.println("--------------------------------------");
        return returnVal;
    }
}

测试代码:

public class JdkProxyTest {
    @Test
    public void testJdkProxy() {
        //创建对象
        ProductService target = new ProductServiceImpl();
        //创建代理对象
        JdkProxy jdkProxy = new JdkProxy(target);
        //代理面向接口
        ProductService proxy = (ProductService) jdkProxy.createProxy();
        //通过代理调用方法
        proxy.add();
        proxy.edit();
        proxy.delte();
        proxy.select();
    }
}

运行结果:

原文地址:https://www.cnblogs.com/Alex-zqzy/p/9311045.html

时间: 2024-10-31 05:17:06

Spring总结七:AOP动态代理的实现的相关文章

Spring(七)动态代理

在上一篇博客中简单写了一下静态代理,这里主要讲一下动态代理 动态代理主要有两种 JDK动态代理   CGLIB动态代理 那这两种代理有什么区别呢? (根据自己的理解总结) 1.JDK动态代理 他的特点是:目标对象必须有接口 他的实质是:创建了接口的一个实现类 他运行的时机:程序运行时 2.CGLIB动态代理 他的特点是:在一个类型没有接口的情况下进行代理 他的实质是:在内存中构建目标类型的子类 他运行的时机是:编译时 简单介绍完这两种代理后,就用个例子具体看怎么实现动态代理 先做JDK动态代理

详解 spring AOP 动态代理

通过例子查看,首先建立一个实现动态代理的接口Interface1.java,代码如下: package my.spring.fuck.aoptest; public interface Interface1 { public void say_hello(); } 很简单的一个接口,然后定义一个这个接口的实现类MyImple.java,代码: package my.spring.fuck.aoptest; public class MyImple implements Interface1{ @

Spring中的cglib动态代理

Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cglib不需要实现接口. 下面使用cglib动态代理的方法实现增强 步骤一:创建一个接口UserService public interface UserService { public void delect(); } 步骤二:创建一个UserService接口的实现类UserServiceImpl

Spring中的JDK动态代理

Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层技术. JDK的动态代理主要涉及Java.lang.reflect包中的两个类:Proxy和InvocationHandler.其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起.而Proxy为Invo

spring aop 动态代理批量调用方法实例

今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候要批量调用这些同名方法,我觉得这里可以发展成有潜力的代码. 推送比较好做数据,队友们都写好代码,但是有个问题,方法要的值都大致相同,封装的方式不一致,多人开发,有的封装对象里面,有的直接使用 Map.get(),唉,一千个人一千个哈姆雷特嘛,只好利用反射和动态代理节省自己的代码量,而且这种方式练练手

Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只能为接口创建代理实例. 如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生成被代理接口的新的匿名实现类. JDK动态代理具体实现原理: 通过实现InvocationHandlet接口创建自己的调用处理器: 通过为Proxy类指定ClassLoader对象和一组in

Spring AOP动态代理

出现org.springframework.aop.framework.ProxyFactoryBean cannot be cast to 错误 在类型转换的时候, 调用getObject()方法,再对ProxyFactoryBean进行转换 xml文件 <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy><!--使用cglib动态代理--> <be

AOP动态代理

Aspect Oriented Programming  面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流. AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能.最常见的就是事务控制.工作之余,对于使用的工具,不免需要了解其所以然.学习了一下,写了些程序帮助理解. AOP 主要是利用代理模式的技术来实现的. 1.静态代理:就是设计模式中的pr

String Aop 动态代理例子

动态代理原理:spring AOP采用动态代理来实现 (1)定义一个接口Boy package aop001; public interface Boy { public void beat(String time); public void play(String time); } (2)定义两个类实现Boy接口: Boy_1 package aop001; public class Boy_1 implements Boy { @Override public void beat(Strin