spring创建bean如何创建代理
-
在Spring中创建代理主要有两种方式,分别是JDK动态代理和CGLIB动态代理。
- JDK动态代理
JDK动态代理是基于接口的动态代理,通过代理类实例化一个实现了接口的代理对象。具体步骤如下:
(1)创建目标类和接口
首先需要创建一个目标类,并定义一个接口,该接口定义了目标类的方法。(2)实现InvocationHandler接口
创建一个实现InvocationHandler接口的代理类,该类重写invoke方法,在invoke方法中实现具体的代理逻辑。(3)获取代理对象
使用Proxy类的静态方法newProxyInstance获取代理对象,该方法接收三个参数,包括类加载器、接口数组和InvocationHandler对象。(4)调用代理对象的方法
最后只需要调用代理对象的方法,代理对象会调用invoke方法触发代理逻辑。- CGLIB动态代理
CGLIB动态代理是基于类的动态代理,通过继承目标类生成代理类。具体步骤如下:
(1)引入CGLIB库
首先需要引入CGLIB库,可以通过Maven或Gradle等构建工具添加依赖。(2)创建目标类
创建一个目标类,该类不需要实现接口。(3)实现MethodInterceptor接口
创建一个实现MethodInterceptor接口的代理类,该类重写intercept方法,在intercept方法中实现具体的代理逻辑。(4)创建Enhancer对象并设置父类和回调方法
使用Enhancer类的create方法创建一个代理类的实例,然后通过setSuperclass方法设置父类和setCallback方法设置回调对象。(5)调用代理对象的方法
最后只需要调用代理对象的方法,代理对象会调用intercept方法触发代理逻辑。总结:
通过以上两种方式,Spring可以创建代理对象来实现在目标方法执行前后进行额外的操作,如日志记录、事务管理等。在实际应用中,根据实际需求选择合适的代理方式来创建代理对象。1年前 - JDK动态代理
-
在Spring中,可以使用两种方法创建代理:基于JDK的动态代理和基于CGLIB的动态代理。
- JDK动态代理:JDK动态代理是通过在运行时动态地创建接口的实现类来实现的。Spring通过使用Java的反射机制来创建代理类。使用JDK动态代理时,被代理的目标类必须实现至少一个接口。
首先,需要定义一个实现InvocationHandler接口的代理类。InvocationHandler接口有一个invoke方法,它会在代理对象的方法被调用时被调用。在invoke方法中,可以执行一些前置操作、调用目标方法并执行一些后置操作。
然后,使用Proxy类的静态方法newProxyInstance来创建代理对象。newProxyInstance方法需要三个参数:ClassLoader、代理接口数组和InvocationHandler对象。ClassLoader是加载代理类的类加载器,通常使用目标类的类加载器。代理接口数组是被代理的目标类实现的接口数组。InvocationHandler对象是定义拦截器逻辑的对象。
- 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创建代理对象的步骤如下:
- 定义一个实现InvocationHandler接口的代理类,重写invoke方法,实现拦截逻辑;
- 使用Proxy类的静态方法newProxyInstance创建代理对象,传入ClassLoader、代理接口数组和InvocationHandler对象;
- 引入CGLIB的依赖;
- 定义一个MethodInterceptor类,实现intercept方法,实现拦截逻辑;
- 使用Enhancer类的create方法创建代理对象,设置目标类作为代理类的父类和MethodInterceptor对象;
- 在Spring配置文件中通过aop:config和aop:aspect标签配置切面和通知;
- 在客户端中使用@Autowired或者@Qualifier注解注入代理对象。
1年前 -
在Spring中,使用代理是实现AOP(面向切面编程)的关键。代理可以在目标对象的方法执行前后执行其他逻辑,例如日志记录、事务管理等。Spring框架为我们提供了两种创建代理的方式:使用JDK动态代理和使用CGLib动态代理。
- 使用JDK动态代理:
JDK动态代理是指通过Java反射机制在运行时生成代理类和代理对象。
第一步:定义接口
首先,需要定义一个接口,该接口中定义了目标对象的方法和业务逻辑。第二步:实现目标对象
然后,我们需要实现目标对象,也就是提供了具体的业务逻辑。第三步:创建切面类
切面类中定义了需要在目标方法执行前后执行的方法。这些方法通常称为增强方法。第四步:实现InvocationHandler接口
创建一个实现InvocationHandler接口的类,该类需要重写invoke方法。该方法在代理对象调用方法时执行增强逻辑。第五步:创建代理对象
使用Proxy类的newProxyInstance方法创建代理对象。该方法需要传入三个参数:ClassLoader、目标对象的接口和InvocationHandler实现类。- 使用CGLib动态代理:
CGLib动态代理是指通过ASM字节码框架生成一个继承目标类的子类作为代理类。
第一步:引入依赖
首先,需要在项目的pom.xml文件中引入CGLib的依赖。第二步:定义目标类
定义一个目标类,该类将成为代理类的父类。第三步:创建切面类
创建一个切面类,该类中定义了需要在目标方法执行前后执行的方法。第四步:实现MethodInterceptor接口
创建一个实现MethodInterceptor接口的类,该类需要实现intercept方法。该方法在代理对象调用方法时执行增强逻辑。第五步:创建代理对象
使用Enhancer类的create方法创建代理对象。该方法需要传入两个参数:目标类的ClassLoader和MethodInterceptor实现类。无论是使用JDK动态代理还是CGLib动态代理,最终都会生成一个代理类和一个代理对象。我们可以将代理对象注入到Spring容器中,然后使用该对象调用目标方法。Spring框架会自动在方法执行前后执行切面中定义的增强逻辑。
1年前