【问题标题】:Instantiation of class inside method vs autowire in spring mvcspring mvc中方法内部类的实例化与自动装配
【发布时间】:2017-12-16 07:58:47
【问题描述】:

服务类和存储库类在spring mvc中是autowired。但是实体和 dto 类是在方法中实例化的。有什么具体原因吗。

@Autowired
TestService testService;

但是对于方法实例化

public TestDto getData(){
    TestDto testDto = new TestDto();
    /*Some task*/
    return testDto;
}

为什么在编写代码时不自动装配 dto 类。提前致谢。

【问题讨论】:

  • “为什么 dto 类不能自动装配”谁说的? (旁注,代码应为return testDto;
  • 是的,感谢旁注。但在大多数情况下,dtos 是在方法内部实例化的,为什么它不是自动装配的。
  • 你应该问作者,而不是我们
  • 这不是特定于作者的。但大多数例子都有这样的结构。

标签: java spring


【解决方案1】:

如果我正在编写您提供的代码,我也会像作者一样在方法内创建一个带有“新”的 DTO。我会解释原因,并希望它能提供一些观点(当然你可以从代码作者:) 那里得到最终答案)。

所以,Spring 是一个“依赖”注入框架(我这里强调一个“依赖”这个词)。这意味着注入非常适用于依赖项(例如具有 @Autowire-d 服务的控制器)。

现在 DTO 不是依赖项。依赖通常意味着你想要使用的一些契约(通过注入一些遵守这个契约的东西,读取依赖 bean 的接口)。 DTO 没有功能契约,它们更像是由服务构造/传递给服务以封装数据的对象。所以我不把它们算作依赖项,因此它们不应该被注入。

在更广泛的意义上,使用 spring 并不意味着“不要使用新的关键字”——它只是意味着——“不要使用新的关键字来创建依赖项”,至少从我的角度来看是这样。

【讨论】:

    【解决方案2】:

    @Autowire 用于注入 bean。一个 bean 通常是一个单例(只有一个实例被创建并在它注入的所有 bean 之间共享),并且它本身可能具有其他自动装配的 bean,例如配置或数据库连接。为了让所有这些连接正常工作,Spring 必须负责实例化 bean。

    如果这些特性都不需要,并且您只需要创建一个普通 java 对象的新的唯一实例,那么您只需通过 new() 实例化它。

    【讨论】:

      猜你喜欢
      • 2020-05-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2012-04-21
      • 2023-03-07
      • 2011-01-24
      相关资源
      最近更新 更多