IOC容器下应该包含哪些类型的对象?

3
我正在使用Spring和Spring MVC构建Web应用程序,并且我希望尽可能地使用简洁的设计。我已经学习了依赖注入和反转控制,但我仍然不完全理解它们。几乎总是避免创建新对象并代替注入是否是一个好习惯?我理解服务和DAO对象是很好注入的,但在哪些情况下应该只创建一个新实例呢?

2
实例创建有时可能是一个繁重的过程,特别是当Spring需要应用后处理、代理等操作时。如果对象不需要由Spring管理(没有注入目标、没有代理、没有AOP),那么就自己创建它。 - Sotirios Delimanolis
单例对象也是注入的一个不错选择。 - csn
3个回答

4

以下是我个人不会使用Spring管理的对象举例:

  • Domain objects - 通常情况下,这些短暂的对象由持久化框架(如Hibernate)管理其生命周期,不需要Service/DAO对象的依赖。
  • Value objectsData transfer objects
  • 我想要用自己的工厂创建的对象-我更喜欢在工厂内部确定要创建哪种类型的对象。Spring可以管理工厂本身。
  • 任何为类或应用程序层内部使用而创建的对象

总的来说,我不会在以下情况下使用Spring来管理对象:

  • 该对象没有依赖于Spring管理的其他bean
  • Spring不能帮助我测试这个对象
  • 它不需要使用Spring管理的任何资源,如数据源、事务、调度器等。
  • 我不需要Spring通过附加行为来装饰它
  • 当它严重影响我的代码可读性时
  • 它是一个短暂的对象,只包含状态而没有逻辑

2

我想没有标准答案。在我看来,Spring bean 的好候选者的重要特征包括:

  • 与应用程序(或作用域)一样长寿
  • 需要像安全性、事务管理等 AOP 理理想处理的东西
  • 是单例的(更确切地说:每个作用域只有一个实例)
  • 在实例化后不会发生更改

例如,控制器、服务和存储库共享这些特征。


1
一个不错的经验法则是,如果一个对象是多个其他对象的依赖项,那么将其作为bean可能是明智的选择,这样Spring就可以自动连接适当的实例。
话虽如此,Spring更喜欢单例bean,但老实说,这似乎是过去的遗物,因为获取单例锁的成本很可能比在需要时创建新实例要高得多。因此,除非该对象具有实际需要在对象使用之间持续存在的状态,否则不要将任何bean设置为单例范围。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接