我从Spring启动中检查一些自动配置类。
在LiquibaseAutoConfiguration.class
我注意到LiquibaseProperties是自动装配的,同时使用new
运算符创建:
@Autowired
private LiquibaseProperties properties = new LiquibaseProperties();
@Autowired
private ResourceLoader resourceLoader = new DefaultResourceLoader();
这不适用于所有配置类,我在JooqAutoConfiguration
中也注意到了这一点。为什么在这里使用new
运算符?
答案 0 :(得分:3)
它只与@Autowired(required=false)
一起使用。在这种情况下,如果实例不可用于注入,则由new
创建的实例将用作默认值。
在示例中,您已经显示注入的实例始终是必需的,因此new
创建的实例将被注入的实例替换,否则如果没有要注入的实例,则会发生失败。简而言之,它是多余的,代码可能是这样编写的:
@Autowired
private LiquibaseProperties properties;
@Autowired
private ResourceLoader resourceLoader;
Spring Boot 1.4通过转向构造函数注入来解决这个问题。 Spring Framework 4.3中引入了对配置类中构造函数注入的支持。 code in question现在将字段声明为final
并在构造函数中指定它们的值。
答案 1 :(得分:0)
如果考虑对象的构造,如果不使用new
运算符,则有一段时间该字段将为null。我试图找到一个显示托管bean生命周期的图表,但只找到了回调文档(Spring Reference)。
Spring通常会使用默认构造函数实例化bean,并对对象执行“普通”操作(初始化字段)。因此,在这种情况下,字段会为这些字段分配新的类实例。然后Spring出现并根据在ApplicationContext中管理的类的实例自动装配字段。
它看起来很奇怪,但可能是由于类中的一些初始化,在Spring可以进行自动装配之前必须存在默认属性和资源加载器对象?