SpringAOP动态代理技术自动生成代理类原理演示

Stella981
• 阅读 645
  • //如下是自动生成代理类的逻辑演示:

  • 为了解耦合将类的方法单纯在代理类里调用;额外功能都在代理类里实现

  • 代理类的存在的问题就是开发代码量大代码冗余.为了解决这类问题使用AOP动态代理自动生成代理类

  • public interface Man { public void alive();//提供一个接口 }

    public class ManImpl implements Man {//提供一个接口的实现类. //实际情况写service是事务和核心功能一起书写的.为了将核心功能和额外功能区分开解耦合.所以要想办法去分开写核心功能和额外功能比如这里这里的事务 @Override public void alive() { System.out.println("duanming:"+new ManImpl().getClass().getSimpleName());//忽略.单纯反射查看短名 } }

    import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation;

    public class ManB implements MethodInterceptor{//所谓的功能增强类就是额外功能放置的地方

    @Override
    public Object invoke(MethodInvocation mi) throws Throwable {//这里mi就是拿到的目标类的类对象.
        System.out.println("---事务开启前---");
        Object object = mi.proceed();//调用目标对象的目标方法
        System.out.println("---事务开启后---");
        return object;
    }
    

    }

    //将manimpl对象交给spring工厂管理

    <bean id="baozhuang" class="com.youyi.test6.ManB"></bean>
    

    //将增强类交给Spring工厂管理

    <aop:config>
    

    //这里选择切入点:选择在谁的周围插入. <aop:pointcut id="pc" expression="execution(void com.youyi.test6.ManImpl.alive())"/> //开始组装,确认切入点和功能增强类
    <aop:advisor pointcut-ref="pc" advice-ref="baozhuang"/> import org.junit.Test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class TestAOP { @Test //测试类 public void test1(){ //创建spring工厂.beanFactory是所有spring工厂接口和实现类的父接口. BeanFactory bf = new ClassPathXmlApplicationContext("classpath:/com/youyi/test6/applicationContext.xml"); Man man = (Man)bf.getBean("man");//getBean("id")拿到对应的全类名的类的类对象.反射拿出来的. System.out.println(man); man.alive();//调用方法 } }

    //这就是控制台的打印结果://如下可知.mi.proceed();这个方法加载的也就是所谓的切入点所实际在的位置.com.youyi.test6.ManImpl@e349529 ---事务开启前--- duanming:ManImpl ---事务开启后---

实际开发的时候aop依赖包导包:三个相关依赖包:asm-3.3.1.jar   cglib-2.2.2.jar,com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

对应导入spring开发常见的包

之后搭建环境跟spring类似.区别只是多了这三个依赖包.

  • SpringAOP对应的开发步骤:
    •   准备目标类
    • 书写增强类
    • 写对应的bean标签
    • 配置自动生成代理所需要的aop:comfig标签
    • 之后新的自动生成的代理类通过getBean(目标类对应的id)获得.
点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
CGLIB介绍与原理(通过继承的动态代理)
一、什么是CGLIB?CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。二、CGLIB原理CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的
Easter79 Easter79
3年前
Spring的两种代理JDK和CGLIB的区别浅谈
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Easter79 Easter79
3年前
Spring的Aop调用当前类的两种方法
我们知道Spring对于AOP实现有两种方法,如果类是接口实现类,则采用JDK动态代理实现AOP。如果类没有实现接口,则采用cglib生成子类做增强,以实现代理类的目的,其实运行时找到的是这个代理类,而不是原类。所以在一个代理类中调用内部的方法,是不是再走AOP逻辑的,那有什么好的方法可以解决这种问题吗?基于上面的思路有两种解决办法方法一:直接从
Stella981 Stella981
3年前
Spring AOP 两种代理 Cglib、JDK
概念AOP:AOP是OOP(面向对象编程)的一种延续,OOP中继承的思想主要是提高代码的重用率,但是继承不能同个类在多个方法的相同位置出现的相同代码的问题JDK动态代理:AOP的一种实现,仅支持实现了接口的类。性能较好Cglib:AOP的一种实现,支持实现了接口的类和没有实现接口的类。对比JDK动态代理性能较差SpringAOP:结
Wesley13 Wesley13
3年前
CGLIB代理基础
  本文意在讲解CGLIB的基础使用及基本原理。一、CGLIB的基本原理:  依赖ASM字节码工具,通过动态生成实现接口或继承类的类字节码,实现动态代理。  针对接口,生成实现接口的类,即implements方式;针对类,生成继承父类的类,即extends方式。二、为什么使用CGLIB?  JDK的动态代理只能基于接口,有时候我们想基于类
Wesley13 Wesley13
3年前
AOP的自动代理
Spring的aop机制提供两类方式实现类代理。一种是单个代理,一种是自动代理。单个代理通过ProxyFactoryBean来实现(就如上面的配置)。自动代理:自动代理能够让切面定义来决定那个bean需要代理,不需要我们为特定的bean明确的创建代理从而提供一个更完整的aop实现通过BeanNameAutoProxyCreator或者Defaul
Easter79 Easter79
3年前
Spring的两种动态代理:Jdk和Cglib 的区别和实现
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Wesley13 Wesley13
3年前
Java动态代理机制解析
动态代理是指在运行时动态生成代理类。不需要我们像静态代理那个去手动写一个个的代理类。生成动态代理类有很多方式:Java动态代理,CGLIB,Javassist,ASM库等。这里主要说一下Java动态代理的实现。Java动态代理InvocationHandler接口Java动态代理中,每一个
Wesley13 Wesley13
3年前
Java动态代理
jdk动态代理实现原理:利用字节码技术,生成新的class文件,来达到动态代理效果。新的class文件是怎么组织的?由于代理目标是接口,则通过实现接口和继续代理类来完成。看看下面的例子更容易明白。demo接口publicinterfacePeoPleInterface{