Spring @Autowired vs使用' new'用于创建Object的关键字

时间:2015-06-18 07:08:05

标签: java spring autowired

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

我得到了它促进松散耦合的部分,并且每次创建一个新的对象而不是什么' new'关键字do。

但是我们应该为我们需要在我们的应用程序中使用的第三方对象做些什么。例如,我正在使用一个休息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创建新的对象。使用此代码,每次调用其余API时,它都会创建三个新对象。这是正确的方法还是我应该将它们标记为@Autowired。请详细说明。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

由于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<String> entity = new HttpEntity<String>("parameters", headers);
         restTemplate.exchange(url, HttpMethod.POST, entity, String.class); 
    }

}