【问题标题】:using @Autowired many times多次使用@Autowired
【发布时间】:2016-06-18 14:29:52
【问题描述】:

我对spring很陌生,所以我可能会问一些愚蠢的问题,但无论如何......

我已经构建了 Spring MVC 4.0 应用程序。

我的设置是这样的:

控制器 >> 服务 >> DAO

在控制器级别我使用大约 4 到 5 个不同的 @Autowired 变量,像这样

@Autowired
private ClientService clientService;
@Autowired
private CommentService commentService;
@Autowired
private SearchService searchService;

在服务级别 I Autowire 也有几个 DAO

@Autowired
SearchDAO searchDAO;

@Autowired
private ActivityDAO activityDAO;

@Autowired
private UserService userService;

我有大约 10 个不同的控制器,其中大多数我 @Autowire 相同的服务,所以我的问题是这样好吗?

可以根据需要多次使用@Autowire 还是会带来过多的内存使用?它会对我的应用程序产生其他影响吗?

我使用 Spring 4.0 + hibernate JPA

【问题讨论】:

  • 我不会担心内存使用,但这么多的依赖关系可能是违反Single Responsibility Principle 的标志。这不是一个硬性规定,但有可能你的班级有太多的责任。也许你可以把它们分解成更小的服务。
  • spring中的beans默认是单例的,所以只有一个实例存在。没有内存问题
  • 我同意阿里的观点。您可能还想拆分控制器
  • 按域对象定义服务对我来说似乎是一种反模式。服务通常实现使用不同类型域对象的用户活动,无论如何都必须在同一事务中进行操作,因此这种隔离没有帮助,并且导致服务数量荒谬。

标签: java spring hibernate spring-mvc


【解决方案1】:

@Autowired没有问题。

Autowired 在 Spring 上下文中找到 bean 并分配给变量。它只是引用 Service/Dao bean 的同一个对象。它不会创建重复项。

但是将这么多对象注入到一个类中表明一个类做了很多事情。尽可能检查将类重构为多个类的可能性。

【讨论】:

    【解决方案2】:

    我有大约 10 个不同的控制器,其中大多数我 @Autowire 提供相同的服务,所以我的问题是可以吗?

    可以在控制器之间重用服务。也就是说,我会犹豫在每个控制器中使用多个服务并重构代码,以使控制器不会变得“太胖”。一般来说,我努力将我的控制器作为 HTTP 世界和 Java 世界之间的映射层,并将所有业务逻辑下推到服务层。

    默认情况下,Spring 将使用singelton scope 创建 bean,这意味着如果您在多个控制器中自动装配同一个 bean,它们将共享同一个 bean 实例。

    可以根据需要多次使用@Autowire 还是会带来过多的内存使用?它会对我的应用程序产生其他影响吗?

    自动装配本身不需要太多内存,它只是对 Java 对象实例的引用。通常,Spring bean 不包含任何状态(它们将其委托给缓存和数据库等组件),因此除非您做一些特殊的事情,否则您不必担心内存使用情况。

    需要注意的一点是,您是否应该避免在 bean 之间创建循环依赖关系。由于您使用的是字段注入,因此 Spring 在应用程序初始化期间会抛出异常,您需要重构您的应用程序。

    【讨论】:

      【解决方案3】:

      答案和一些 cmets 已经就您的记忆问题给出了答案。关于你的其他问题

      我有大约 10 个不同的控制器,其中大多数我 @Autowire 相同的服务,所以我的问题是这样好吗?

      从设计的角度来看,这听起来很糟糕。 Ali Deghani 提到了单一职责原则。实际上,如果您要将服务从作为字段自动装配移动到通过构造函数自动装配,它会立即提示您是否应该考虑重构,amongst other benefits

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 2020-07-09
        • 2019-11-11
        • 1970-01-01
        相关资源
        最近更新 更多