Spring @Autowired 与使用 'new' 关键字创建对象

Spring @Autowired vs using 'new' keyword to create Object

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

我知道它促进了松散耦合,并且每次都创建一个新对象,这与 'new' 关键字所做的相反。

但是对于我们需要在我们的应用程序中使用的第三方对象,我们应该怎么做。例如我正在消耗休息 API 因为我需要初始化三个 类 ,像这样

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

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

由于 restTemplate 是您要重用的唯一 class,因此将它放在具有范围 Singleton 的 bean 中可能是明智的(默认范围,因此只是一个普通的 bean)。 另外两个 class 可以在每次调用使用此客户端的方法时创建。请注意,您还可以将 Entity 和 Header 作为参数传递...所以我不明白您为什么要使用 spring.

class MyClass {
    @Autowired
    private RestTemplate restTemplate;

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

}

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

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

@Autowire的典型用途是在初始化bean时自动填充一个属性,具有单例依赖。不管是您的代码还是第三方 class。您需要考虑它是否是您程序逻辑的一部分,或者它是否真的是一个应该初始化一次并重用的依赖项。

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