Java Spring@Autowired vs使用';新';关键字来创建对象

Java Spring@Autowired vs使用';新';关键字来创建对象,java,spring,autowired,Java,Spring,Autowired,我正在学习Spring并构建一些实验应用程序。我不知道在哪里使用@Autowired来创建对象 我得到的部分是,它促进松散耦合,并且每次都创建一个新对象,而不是“new”关键字所做的 但是,对于我们需要在应用程序中使用的第三方对象,我们应该做些什么呢。例如,我正在使用一个RESTAPI,为此我需要初始化三个类,如下所示 RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders();

我正在学习Spring并构建一些实验应用程序。我不知道在哪里使用@Autowired来创建对象

我得到的部分是,它促进松散耦合,并且每次都创建一个新对象,而不是“new”关键字所做的

但是,对于我们需要在应用程序中使用的第三方对象,我们应该做些什么呢。例如,我正在使用一个RESTAPI,为此我需要初始化三个类,如下所示

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 RestTemplate=new RestTemplate();
HttpHeaders=新的HttpHeaders();
setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity=新的HttpEntity(“参数”,标题);
exchange(url,HttpMethod.POST,entity,String.class);

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

因为restTemplate是您将要重用的唯一类,所以将其放在具有范围单例(默认范围,因此只是普通bean)的bean中可能是明智的。 每次调用使用此客户端的方法时,都可以创建另外两个类。请注意,您还可以将实体和标头作为参数传递。。。所以我不明白你为什么要用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); 
    }

}
class-MyClass{
@自动连线
私有RestTemplate RestTemplate;
public void callTheRestClient(){
HttpHeaders=新的HttpHeaders();
setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity=新的HttpEntity(“参数”,标题);
exchange(url,HttpMethod.POST,entity,String.class);
}
}
您需要使用“scope”。默认情况下,当您使用@autowiredspringbean时,scope是singleton。这意味着spring在使用@Autowired的地方注入相同的单例对象。通过制作scope prototype,您指示Spring为每个@Autowired注入创建新对象


请参阅

在初始化bean时,
@Autowire
的典型用法是使用单例依赖项自动填充属性。不管是您的代码还是第三方类。你需要考虑它是否是程序逻辑的一部分,或者它是否是一个依赖项,它应该被初始化一次并重新使用。
如果您的代码> RestMase需要在每个代码> Exchange < /C>之前进行相同的初始化,那么您可以考虑使用<代码> @ Autowire > /CODE >并在Spring的配置中初始化bean。例如,从这个意义上讲,它类似于
数据源。但是如果你把它看作是程序逻辑的一部分(比如连接或文件),那么不要考虑它的代码> @ Autowire < /代码>。这将使您的程序更加复杂,但不会带来显著的收益。

您需要使用“范围”,请参阅[spring autowired instantiate new bean][1][1]:再多说几句:如果您使用spring IOC,您将尝试去除所有新操作符,并让spring处理所有对象创建。这里最重要的一点是范围。(原型/单体)还有更多,但现在你只需要这两个。