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
。它会使您的程序变得更加复杂,但不会带来显着的收益。
我正在学习 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
。它会使您的程序变得更加复杂,但不会带来显着的收益。