将@Autowired与新关键字一起使用有什么意义?

时间:2016-09-19 23:17:41

标签: spring-boot

我从Spring启动中检查一些自动配置类。 在LiquibaseAutoConfiguration.class我注意到LiquibaseProperties是自动装配的,同时使用new运算符创建:

    @Autowired
    private LiquibaseProperties properties = new LiquibaseProperties();

    @Autowired
    private ResourceLoader resourceLoader = new DefaultResourceLoader();

这不适用于所有配置类,我在JooqAutoConfiguration中也注意到了这一点。为什么在这里使用new运算符?

2 个答案:

答案 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可以进行自动装配之前必须存在默认属性和资源加载器对象?