Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 使用@Autowired和new关键字有什么意义?_Spring Boot - Fatal编程技术网

Spring boot 使用@Autowired和new关键字有什么意义?

Spring boot 使用@Autowired和new关键字有什么意义?,spring-boot,Spring Boot,我检查了Spring boot中的一些自动配置类。 在LiquibaseAutoConfiguration.class中,我注意到liquibaseproperty是自动连接的,同时使用new操作符创建: @Autowired private LiquibaseProperties properties = new LiquibaseProperties(); @Autowired private ResourceLoader resourceLoader =

我检查了Spring boot中的一些自动配置类。 在
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
,并在构造函数中赋值