2011-03-13 48 views
7

是否是有意义的Spring使用@Autowired直接连线到一个具体的类,而不是一个接口(和使用“按类型”自动装配)使用Spring直接连接一个具体类

如果类没有实现接口,通过构造函数或工厂实例化它不是更好(保持简单);而不是让它成为Spring bean。

回答

16

是否是有意义的Spring使用@Autowired直接连线到一个具体的类,而不是接口

肯定。自动装配的做法是独立于什么您自动装配。它将和类以及接口一起工作。

但是,它是否是一个好主意是值得商榷的,虽然这是你是否应该始终采用的接口给定类,而不是直接对话类的类型更广泛的问题。其优点包括更简单的单元测试和更简洁的设计,代价是代码混乱。

还有一个很好的理由,自动装配接口类型,而不是类的类型,这是:如果Spring需要注射之前生成周围的豆代理对象,那么如果bean的类定义任何接口,则代理会实现这些接口,并且而不是与bean类本身是类型兼容的。如果您尝试通过类类型自动装载该bean,它将失败。避免这种令人讨厌的情况的最简单方法是始终按照接口类型自动装配,这样就可以按照您的预期工作。

,并利用“按类型”自动装配

如果你的意思container-level byType autowiring,那么你不想做。这是旧式的Spring 1.x风格的自动装配,并且非常灵活(请参阅limitations of autowiring)。

棒与@Autowired,它更灵活,更容易控制。

如果一个类没有实现一个接口,不是通过构造函数或工厂实例化它会更好(保持简单);而不是让它成为Spring bean。

这两个问题是完全分开的。如果你需要Spring来控制它的依赖和生命周期,不管它是否实现接口,一个对象应该被做成一个Spring bean。如果你发现这个对象没有依赖关系,并且没有有意义的接口,那么也许没有理由把它变成一个bean。

0

你将不得不决定是否硬连线这种依赖关系到其它类就可以了。例如,有多少不同的类可能需要这种依赖关系?如果答案很多,那么你将创建这个类的许多实例,只需要一个实例。

此外,没有这个具体的类有什么依赖关系?你将不得不配置依赖它的类。

dependency injection目的是减少类之间的依赖关系,使你的代码的松耦合。