Spring boot 使用@Autowired和new关键字有什么意义?
我检查了Spring boot中的一些自动配置类。 在Spring boot 使用@Autowired和new关键字有什么意义?,spring-boot,Spring Boot,我检查了Spring boot中的一些自动配置类。 在LiquibaseAutoConfiguration.class中,我注意到liquibaseproperty是自动连接的,同时使用new操作符创建: @Autowired private LiquibaseProperties properties = new LiquibaseProperties(); @Autowired private ResourceLoader resourceLoader =
LiquibaseAutoConfiguration.class
中,我注意到liquibaseproperty是自动连接的,同时使用new
操作符创建:
@Autowired
private LiquibaseProperties properties = new LiquibaseProperties();
@Autowired
private ResourceLoader resourceLoader = new DefaultResourceLoader();
这并不适用于所有配置类,我在
JooqAutoConfiguration
中也注意到了这一点。为什么在这里使用new
运算符?如果您考虑对象的构造,那么如果不使用new
运算符,该字段将在一段时间内为空。我试图找到一个显示托管bean生命周期的图表,但只找到了回调()的文档
Spring通常使用默认构造函数实例化bean,并对对象执行“正常”操作(初始化字段)。因此,在本例中,这些字段被分配给这些字段的类的新实例。然后Spring出现,并根据ApplicationContext中正在管理的类的实例自动连接字段
它看起来确实很奇怪,但可能是由于类中的某些初始化,在Spring执行自动关联之前,必须存在默认属性和资源加载器对象?如果您考虑对象的构造,则在一段时间内,如果不使用
new
操作符,则该字段将为空用过。我试图找到一个显示托管bean生命周期的图表,但只找到了回调()的文档
Spring通常使用默认构造函数实例化bean,并对对象执行“正常”操作(初始化字段)。因此,在本例中,这些字段被分配给这些字段的类的新实例。然后Spring出现,并根据ApplicationContext中正在管理的类的实例自动连接字段
它看起来确实很奇怪,但可能是由于类中的某些初始化,在Spring进行自动连接之前,必须存在默认属性和资源加载程序对象。它只在
@Autowired(required=false)
中有用。在这种情况下,如果实例不可用于注入,则由new
创建的实例将用作默认值
在您展示的示例中,始终需要注入实例,因此由new
创建的实例将被注入实例替换,或者如果没有要注入的实例,则会发生故障。简言之,它是冗余的,代码可以这样编写:
@Autowired
private LiquibaseProperties properties;
@Autowired
private ResourceLoader resourceLoader;
Spring Boot 1.4通过迁移到构造函数注入解决了这个问题。SpringFramework 4.3中引入了对配置类中构造函数注入的支持。现在,将字段声明为
final
,并在构造函数中分配它们的值。它只在@Autowired(required=false)
中真正有用。在这种情况下,如果实例不可用于注入,则由new
创建的实例将用作默认值
在您展示的示例中,始终需要注入实例,因此由new
创建的实例将被注入实例替换,或者如果没有要注入的实例,则会发生故障。简言之,它是冗余的,代码可以这样编写:
@Autowired
private LiquibaseProperties properties;
@Autowired
private ResourceLoader resourceLoader;
Spring Boot 1.4通过迁移到构造函数注入解决了这个问题。SpringFramework 4.3中引入了对配置类中构造函数注入的支持。现在,将字段声明为final
,并在构造函数中赋值