7

We are working on a new application and we want to use Spring (college project!)

When you are writing a new Spring application, should each and every object be Spring injected?

class A {
    ...
    AHelper helper = new AHelper();
    helper.doSomething();
    ...
}

class AHelper {
    public void doSomething(){}
}
  1. In this case, should AHelper be Spring injected into A using a setter? If class A depends on 5 helpers, should all of them be injected? Is that the best practice and if yes what are we getting out of it?

  2. Also, if class AHelper depends on AHelperHelper and that in turn depends on AHelperHelperHelper, should this entire dependency chain be configured in the XML. It just feels wrong to me!

4

3 回答 3

9

在我看来,最好在项目开始时决定哪些对象是 bean,哪些不是。它可以基于他们的责任感,或者在我的情况下,可以基于他们所在的层。这条规则很容易向其他团队成员解释,它最大限度地减少了项目中间的修改和意外

所以,我通常会做的事情:

  • Controllerservicerepository层是 Spring beans。所有这些通常都连接在一起,同时拥有一些 bean 和一些常规对象 (POJO) 过于复杂。

  • 模型实体不是 Spring bean。如果模型实体只是 POJO,开发通常会更简单。此外,如果您在一次操作中加载数百个,并且它们都是 bean,则可能会导致性能下降。

  • DTO , VO ......好吧,我通常不需要它们,但如果我需要它们,我会将它们视为模型实体。

  • 实用程序类。它们分为三种:

    • 静态方法类:显然它们不能是 bean。它不会帮助你。

    • 简单的对象,例如您自己的地图:只需将它们保留为常规对象即可。

    • Helpers,例如 CsvFileConstructor:在我看来,这些只是服务,但有些人更喜欢将它们放在util包中。无论如何,它们通常需要一些配置(在 CSV 情况下:编码、基本路径、分​​隔符...),因此如果您将它们设为 bean,您可以获得一些好处。

  • Exceptions , enums , ...:当然,没有 bean。

于 2012-07-26T09:58:22.403 回答
7

我见过注入每个对象的项目,这是一场噩梦。

如果出现以下情况,我会确定您可能构建的更大规模的组件并将它们创建为 Spring bean:

  1. 您可能想要配置它们
  2. 在它们上使用 Spring AoP(例如用于事务等)
  3. 客户可能希望使用这些组件重构您的应用程序

例如,在我当前的项目中,我们启用了新的更大规模的组件,我们可能希望启用/禁用这些组件以进行发布,或者其他团队将使用这些组件,或者我们需要启用 JMX(通过 Spring AoP)。

于 2012-07-26T08:22:25.657 回答
3

不是一切。但在那种情况下,这可能是一个好主意,是的。您获得的是通过在其中A注入模拟来进行单元测试的可能性AHelper。您可以获得许多其他东西(安全性、事务性方面等),但这取决于上下文以及对象A的类型AHelper

这同样适用于您的所有连锁店。请注意,虽然 XML 不是配置 Spring 应用程序的首选方式。注释更易于使用,并且允许拥有最小的 XML 配置文件。

于 2012-07-26T08:25:34.797 回答