spring创建bean如何创建代理

fiy 其他 15

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Spring中创建代理主要有两种方式,分别是JDK动态代理和CGLIB动态代理。

    1. JDK动态代理
      JDK动态代理是基于接口的动态代理,通过代理类实例化一个实现了接口的代理对象。具体步骤如下:

    (1)创建目标类和接口
    首先需要创建一个目标类,并定义一个接口,该接口定义了目标类的方法。

    (2)实现InvocationHandler接口
    创建一个实现InvocationHandler接口的代理类,该类重写invoke方法,在invoke方法中实现具体的代理逻辑。

    (3)获取代理对象
    使用Proxy类的静态方法newProxyInstance获取代理对象,该方法接收三个参数,包括类加载器、接口数组和InvocationHandler对象。

    (4)调用代理对象的方法
    最后只需要调用代理对象的方法,代理对象会调用invoke方法触发代理逻辑。

    1. CGLIB动态代理
      CGLIB动态代理是基于类的动态代理,通过继承目标类生成代理类。具体步骤如下:

    (1)引入CGLIB库
    首先需要引入CGLIB库,可以通过Maven或Gradle等构建工具添加依赖。

    (2)创建目标类
    创建一个目标类,该类不需要实现接口。

    (3)实现MethodInterceptor接口
    创建一个实现MethodInterceptor接口的代理类,该类重写intercept方法,在intercept方法中实现具体的代理逻辑。

    (4)创建Enhancer对象并设置父类和回调方法
    使用Enhancer类的create方法创建一个代理类的实例,然后通过setSuperclass方法设置父类和setCallback方法设置回调对象。

    (5)调用代理对象的方法
    最后只需要调用代理对象的方法,代理对象会调用intercept方法触发代理逻辑。

    总结:
    通过以上两种方式,Spring可以创建代理对象来实现在目标方法执行前后进行额外的操作,如日志记录、事务管理等。在实际应用中,根据实际需求选择合适的代理方式来创建代理对象。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Spring中,可以使用两种方法创建代理:基于JDK的动态代理和基于CGLIB的动态代理。

    1. JDK动态代理:JDK动态代理是通过在运行时动态地创建接口的实现类来实现的。Spring通过使用Java的反射机制来创建代理类。使用JDK动态代理时,被代理的目标类必须实现至少一个接口。

    首先,需要定义一个实现InvocationHandler接口的代理类。InvocationHandler接口有一个invoke方法,它会在代理对象的方法被调用时被调用。在invoke方法中,可以执行一些前置操作、调用目标方法并执行一些后置操作。

    然后,使用Proxy类的静态方法newProxyInstance来创建代理对象。newProxyInstance方法需要三个参数:ClassLoader、代理接口数组和InvocationHandler对象。ClassLoader是加载代理类的类加载器,通常使用目标类的类加载器。代理接口数组是被代理的目标类实现的接口数组。InvocationHandler对象是定义拦截器逻辑的对象。

    1. CGLIB动态代理:CGLIB动态代理使用字节码技术生成代理类,对于没有实现接口的类也可以进行代理。在Spring中,如果目标类没有实现任何接口,则会使用CGLIB动态代理进行代理。

    需要注意的是,使用CGLIB动态代理时,目标类不能是final类,而且其方法也不能是final方法。

    使用CGLIB动态代理时,首先需要引入CGLIB的依赖。然后,需要定义一个MethodInterceptor类,实现intercept方法,该方法会在代理对象的方法被调用时被调用。在intercept方法中,同样可以执行一些前置操作、调用目标方法并执行一些后置操作。

    接下来,使用Enhancer类创建代理对象。Enhancer类是CGLIB的核心类,它提供创建代理对象的方法create,可以调用setSuperclass方法设置目标类作为代理类的父类,调用setCallback方法设置MethodInterceptor对象。

    在Spring配置文件中配置代理时,需要使用aop:config标签,并使用aop:aspect标签定义一个切面。在切面中可以定义多个切点和通知类型,包括前置通知、后置通知、环绕通知等。可以使用标签来配置bean,并通过ref属性指定切面的实现类。

    最后,在客户端中使用@Autowired或者@Qualifier注解将代理对象注入到其他类中使用即可。

    总结起来,Spring创建代理对象的步骤如下:

    1. 定义一个实现InvocationHandler接口的代理类,重写invoke方法,实现拦截逻辑;
    2. 使用Proxy类的静态方法newProxyInstance创建代理对象,传入ClassLoader、代理接口数组和InvocationHandler对象;
    3. 引入CGLIB的依赖;
    4. 定义一个MethodInterceptor类,实现intercept方法,实现拦截逻辑;
    5. 使用Enhancer类的create方法创建代理对象,设置目标类作为代理类的父类和MethodInterceptor对象;
    6. 在Spring配置文件中通过aop:configaop:aspect标签配置切面和通知;
    7. 在客户端中使用@Autowired或者@Qualifier注解注入代理对象。
    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring中,使用代理是实现AOP(面向切面编程)的关键。代理可以在目标对象的方法执行前后执行其他逻辑,例如日志记录、事务管理等。Spring框架为我们提供了两种创建代理的方式:使用JDK动态代理和使用CGLib动态代理。

    1. 使用JDK动态代理:

    JDK动态代理是指通过Java反射机制在运行时生成代理类和代理对象。

    第一步:定义接口
    首先,需要定义一个接口,该接口中定义了目标对象的方法和业务逻辑。

    第二步:实现目标对象
    然后,我们需要实现目标对象,也就是提供了具体的业务逻辑。

    第三步:创建切面类
    切面类中定义了需要在目标方法执行前后执行的方法。这些方法通常称为增强方法。

    第四步:实现InvocationHandler接口
    创建一个实现InvocationHandler接口的类,该类需要重写invoke方法。该方法在代理对象调用方法时执行增强逻辑。

    第五步:创建代理对象
    使用Proxy类的newProxyInstance方法创建代理对象。该方法需要传入三个参数:ClassLoader、目标对象的接口和InvocationHandler实现类。

    1. 使用CGLib动态代理:

    CGLib动态代理是指通过ASM字节码框架生成一个继承目标类的子类作为代理类。

    第一步:引入依赖
    首先,需要在项目的pom.xml文件中引入CGLib的依赖。

    第二步:定义目标类
    定义一个目标类,该类将成为代理类的父类。

    第三步:创建切面类
    创建一个切面类,该类中定义了需要在目标方法执行前后执行的方法。

    第四步:实现MethodInterceptor接口
    创建一个实现MethodInterceptor接口的类,该类需要实现intercept方法。该方法在代理对象调用方法时执行增强逻辑。

    第五步:创建代理对象
    使用Enhancer类的create方法创建代理对象。该方法需要传入两个参数:目标类的ClassLoader和MethodInterceptor实现类。

    无论是使用JDK动态代理还是CGLib动态代理,最终都会生成一个代理类和一个代理对象。我们可以将代理对象注入到Spring容器中,然后使用该对象调用目标方法。Spring框架会自动在方法执行前后执行切面中定义的增强逻辑。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部