Spring @Autowired vs使用’new’关键字创建Object

我正在学习Spring并构建一些实验应用程序。 我很困惑在哪里使用@Autowired来创建Object。

我得到了促进松散耦合的部分,并且每次创建一个新的Object而不是’new’关键字。

但是我们应该如何处理我们需要在我们的应用程序中使用的第三方对象。 例如,我正在使用一个restAPI,我需要初始化三个类,类似这样

RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); HttpEntity entity = new HttpEntity("parameters", headers); restTemplate.exchange(url, HttpMethod.POST, entity, String.class); 

这段代码正在为RestTemplate,HttpHeaders和HttpEntity创建新的对象。 使用此代码,每次调用其余API时,它都会创建三个新对象。 这是正确的方法还是我应该标记它们@Autowired。 请详细说明。

@Autowire的典型用法是在初始化bean时使用单例依赖关系自动填充属性。 无论是您的代码还是第三方类,都无关紧要。 您需要考虑它是否是程序逻辑的一部分,或者它是否真的是应该初始化一次并重用的依赖项。

如果您的RestTemplate需要在每次exchange之前进行相同的初始化,那么您可以考虑使用@Autowire并在Spring的配置中初始化bean。 从这个意义上讲,它与DataSource类似。 但是,如果您将其视为一个实用程序类,它被用作程序逻辑的一部分(如连接或文件),那么就不@Autowire其视为@Autowire 。 这将使您的程序更复杂,没有显着的收益。

你需要使用“范围”。默认情况下,使用@Autowired spring bean scope是singleton。 这意味着spring会使用@Autowired注入相同的单例对象。 通过制作范围原型,您指示Spring为每个@Autowired注入创建新对象。

请参考spring-autowired-instantiate-new-bean

由于restTemplate是你要重用的唯一类,可能,将它放在具有范围Singleton的bean中是很精明的(默认范围只是普通的bean)。 每次调用使用此客户端的方法时,都可以创建其他两个类。 请注意,您也可以将实体和标题作为参数传递…所以我不明白为什么要使用spring。

 class MyClass { @Autowired private RestTemplate restTemplate; public void callTheRestClient() { HttpHeaders headers = new HttpHeaders(); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); HttpEntity entity = new HttpEntity("parameters", headers); restTemplate.exchange(url, HttpMethod.POST, entity, String.class); } }