当前位置: 首页 > 知识库问答 >
问题:

Spring@Autowired vs使用“new”关键字创建对象[已关闭]

巢睿
2023-03-14

想改进这个问题吗 通过编辑此帖子,更新问题,使其只关注一个问题。

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

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

但是,对于我们需要在应用程序中使用的第三方对象,我们应该做些什么呢。例如,我正在使用一个rest 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); 

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

共有3个答案

施英哲
2023-03-14

由于restTemboard是您要重用的唯一类,可能,将它放在具有范围Singleton(默认范围,所以只是一个普通bean)的bean中是明智的。每次调用使用此客户端的方法时,都可以创建另外两个类。请注意,您也可以将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); 
    }

}
百里杰
2023-03-14

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

请参考sping-autoweed-instantiate-new-bean

公西英叡
2023-03-14

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

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

 类似资料:
  • 我知道字符串文字和新字符串对象之间的区别,也知道它在内部是如何工作的。但我的问题是,这有点超前。当我们使用new关键字as创建字符串对象时 在本例中,我们传递的是字符串类型的参数。我的问题是这个字符串是在哪里生成的-堆还是字符串常量池还是其他地方? 据我所知,这个参数是一个字符串文字,所以它应该在字符串常量池中。如果是这样的话,那么intern方法的用途是什么?只需将变量str链接到常量池?因为“

  • 问题内容: 在Java中,我知道关键字可以提供变量的可见性。问题是,如果变量是对可变对象的引用,是否还为该对象内部的成员提供可见性? 在下面的示例中,如果多个线程正在访问和更改线程,它是否可以正常工作? 例 问题答案: 这是关于volatile的一些细节的旁注说明。在这里写这个是因为评论太多了。我想举一些例子说明挥发性如何影响可见性,以及在jdk 1.5中如何改变。 给出以下示例代码: 此测试代码

  • 问题内容: 我有需要转换为Java对象的JSON。我需要处理的JSON如下所示: 在搜索引擎(在本例中为“ Jobs”)中输入搜索关键字时,将返回此JSON。我还没有命名这些要创建的变量,这个JSON只是从类似的早期应用程序中“送给”我的。因此,我显然在保存变量和抽象变量方面遇到麻烦。抽象是一个保留关键字,在我读过的任何地方,保留关键字都不能用作变量名。 我无法访问正在更新的以前的应用程序,我想指

  • 有可能使用@Configurable类那 我知道用@Autowired和@Resource等是可能的...还有其他的吗? 如。 然后像这样 除了能够使用<code>new</code>操作符创建<code>MyObj</code>并仍然让spring处理注释之外,还有其他选择吗? ——编辑: 在使用@Autowired时,可以使用来做到这一点,看看一些带有Spring和AOP的Hibernate和

  • 我正在尝试使用new关键字创建一个组件的新实例。组件类有另一个类的自动布线。在第一类中,它有一个调用第二类的方法。代码如下: First.java 第二Java语言 一个pplication.java 我能够使用依赖注入来训练解决方案。我只是想这样做。 提亚

  • 这个问题似乎与帮助中心定义的范围内的编程无关。 我只是想使它的对象,并在控制台屏幕调用方法,但它是显示静态引用的错误。 请帮助我创建一个没有此静态引用错误的对象。