详解 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{
    @Override
    public void say_hello() {
        System.out.println("hello world");
    }
}

下面就是我们要创建的代理类了,创建代理类后就完成了动态代理,是最重要的一步了(ps:虽然这里说代理类,但它并不是Proxy类,看代码后可以看出这个类实现了java.lang.reflect.InvocationHandler接口,InvocationHandler的意思是:“调用处理程序”,意思就是我们实现了动态代理后,是由这个类来处理的,而真正的代理类是java.lang.reflect.Proxy类,好吧,有点绕嘴,代理里有详细注释),代码如下:

package my.spring.fuck.aoptest;

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

//此类实现了InvocationHandler接口,通过API查看,此接口只有一个方法,即下面重写的invoke方法,下面有详细注释
public class MyProxy implements InvocationHandler{

    Object object1;//用来存放被代理的类,本例子中指MyImple.java

    //bind=绑定,是我们自定义的方法,这个方法的形参是Object类型,用来接收被代理类,本例子中是MyImple.java,然后返回一个Proxy类,方法里有详细注释
    public Object bind(Object someObject){
        this.object1=someObject;
        return Proxy.newProxyInstance(object1.getClass().getClassLoader(),object1.getClass().getInterfaces(), this);
        //Proxy=代理,本方法返回一个Proxy类的实例,通过对这个实例操作,即可实现动态代理,看一下上面的三个参数,参数1是类加载器,参数2是被代理的对象,参数3
        //是代理的处理程序,通过此方法来获取对象的代理(Proxy),代理中存储了执行方法时候的处理程序(本例中就是本Class,即MyProxy,是一个实现了InvocationHandler接口的类)
    }

    //下面的方法(invoke)是接口InvocationHandler中的方法,在代理调用此类时,此类调用invoke方法;
    //invoke也是java.lang.reflect.Method中的一个方法,每个类的每个方法都属于Method类,这里不再赘述

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //此方法的3个参数分别代表代理类,方法,方法的参数列表,由系统自动赋值
        System.out.println("AOP 动态代理,在方法执行前的处理");
        Object return_obj=method.invoke(object1, args);//执行被代理类的本来的方法
        System.out.println("AOP 动态代理,在方法执行后的处理");
        return return_obj;
    }

    public static void main(String[] args){
        MyProxy myProxy=new MyProxy();
        Interface1 proxy=(Interface1)myProxy.bind(new MyImple());
        proxy.say_hello();
    }
}

运行Myproxy类,控制台输出如下图:

时间: 2024-08-01 22:46:59

详解 spring AOP 动态代理的相关文章

Spring AOP详解 、 JDK动态代理、CGLib动态代理

AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就成为“连接点”,Spring仅支持方法的连接点,即

【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类

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

java动态代理详解,并用动态代理和注解实现日志记录功能

动态代理的概念 动态代理是程序在运行过程中自动创建一个代理对象来代替被代理的对象去执行相应的操作,例如, 我们有一个已经投入运行的项目中有一个用户DAO类UserDao用来对User对象进行数据库的增删改查操作,但是有一天,要求在对用户的增删改查操作时记录相应的日志,这是怎么办呢?难道我们去直接修改UserDao的源代码,然后在UserDao的每个方法中加入日志记录功能,这显然是不合理的,它违背了java的OCP原则,即对修改关闭对扩张开放.比如改现有的代码如下: 接口类 public inte

详解spring 每个jar的作用

详解spring 每个jar的作用: spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2.jar.spring-src.zip就是所有的源代码压缩包.除了spring.jar 文件,Spring 还包括有其它21 个独立的jar 包,各自包含着对应的Spring组件,用户可以根据自己的需要来选择组合自己的jar 包,而不必引入整个spring.jar

详解Spring框架的核心思想之IOC

微信号:GitShare微信公众号:爱折腾的稻草如有问题或建议,请在公众号留言[1] 前续 为帮助广大SpringBoot用户达到"知其然,更需知其所以然"的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理. No.1 Spring是什么 为了让更多的朋友了解Spring,首先科普一下Spring!有兴趣的朋友可以去Spring官网逛逛,地址是:https://spring.io/ The

用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)

用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心.依赖注入(DI)是IoC的另外一种说法,只是从不同的角度描述相同的概念.看完这两句,是不是不但没懂,反而更迷惑了,别急,往下看: IoC的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 如果我们打开机械式手表的后盖,就会看到与