返回

Spring 依赖注入的代理类创建时机

后端




Spring 依赖注入的代理类创建时机

在 Spring 应用程序中,依赖注入是一种常用的技术,它允许我们以一种松散耦合的方式来创建对象。当我们使用依赖注入时,Spring 会自动创建并管理这些对象,并将其注入到需要它们的类中。

在某些情况下,Spring 会为被注入的类创建一个代理类。这个代理类会拦截对该类的所有方法调用,并执行一些额外的操作。例如,代理类可以用来实现 AOP(面向方面编程),或者可以用来增强类的安全性。

那么,Spring 是在什么时候创建代理类的呢?下面我们来分析一下三种不同的情况:

第一种情况:使用 @AspectJ 注解

当我们在类中使用 @AspectJ 注解时,Spring 会自动为该类创建一个代理类。这个代理类会拦截对该类的所有方法调用,并执行切面逻辑。

第二种情况:使用 AOP XML 配置

当我们在 Spring 配置文件中使用 aop:config 标签时,Spring 也会自动为被切面的类创建一个代理类。这个代理类会拦截对该类的所有方法调用,并执行切面逻辑。

第三种情况:使用 BeanPostProcessor

当我们在 Spring 应用程序中实现一个 BeanPostProcessor 时,Spring 会在 Bean 创建之后和初始化之前调用 BeanPostProcessor 的 postProcessBeforeInitialization() 方法。在这个方法中,我们可以对 Bean 进行一些处理,例如创建一个代理类。

现象说明

第一种情况是最常见的

在普通的Spring应用中,会发现 UserService 和 UserDao 两个类,UserService 依赖 UserDao 。当使用 Spring 注入时,UserService 的构造函数会自动调用,并将 UserDao 的实例注入进来。在调用 UserService 的方法时,实际上是调用代理类的方法,而代理类会调用真正的 UserService 的方法,并记录日志或做其他增强。

第二种情况是针对 XML 配置的应用

在 XML 配置的 Spring 应用中,可以使用 aop:config 标签来配置 AOP。当使用 AOP 时,Spring 会自动为被切面的类创建一个代理类。这个代理类会拦截对该类的所有方法调用,并执行切面逻辑。

第三种情况是针对实现 BeanPostProcessor 接口的应用

BeanPostProcessor 是一个 Spring 提供的接口,可以用来对 Bean 进行一些处理。当我们在 Spring 应用程序中实现一个 BeanPostProcessor 时,Spring 会在 Bean 创建之后和初始化之前调用 BeanPostProcessor 的 postProcessBeforeInitialization() 方法。在这个方法中,我们可以对 Bean 进行一些处理,例如创建一个代理类。

希望这篇文章对您有所帮助!