在Spring中使用@Autowired直接连接到具体类而不是接口(并使用'by type'自动装配)是否有意义
如果一个类没有实现接口,那么通过构造函数或工厂实例化它会更好(保持简单);而不是仅仅为了它而使它成为一个Spring bean。
答案 0 :(得分:17)
在Spring中使用
是否有意义?@Autowired
直接连接到具体类而不是接口
不确定。自动装配的做法与你自动装配的无关。它既适用于类,也适用于接口。
然而,这是否是一个好主意是有争议的,虽然这是一个更普遍的问题,你是否应该总是为给定的类引入一个接口,而不是直接与类类型对话。其优点包括更简单的单元测试和更简洁的设计,代价是代码混乱。
还有一个很好的理由来自动化接口类型而不是类类型,这就是如果Spring需要在注入之前围绕bean生成代理对象,那么如果bean的类定义任何接口,然后代理将实现这些接口,并且不与bean类本身类型兼容。如果您尝试按类类型自动装配该bean,它将失败。避免这种恼人情况的最简单方法是始终按接口类型进行自动装配,这样它就可以按照您的预期运行。
并使用'按类型'自动装配
如果您的意思是container-level byType
autowiring,那么您不想这样做。这是旧的Spring 1.x风格的自动装配,它非常不灵活(见limitations of autowiring)。
坚持@Autowired
,它更灵活,更容易控制。
如果一个类没有实现接口,那么通过构造函数或工厂实例化它会更好(保持简单);而不是仅仅为了它而使它成为一个Spring bean。
这两个问题是完全分开的。如果你需要Spring来控制它的依赖关系和生命周期,那么对象应该是一个Spring bean,无论它是否实现了接口。如果您发现该对象没有依赖关系,并且没有有意义的接口,那么也许没有理由将它变成bean。
答案 1 :(得分:0)
您必须决定是否将此依赖项硬连线到其他类中。例如,有多少不同的类可能需要这种依赖?如果答案很多,那么您将创建此类的许多实例,其中只需要一个。
此外,这个具体课程有哪些依赖性?您必须在类中配置依赖它的那些。
dependency injection的对象是减少类之间的依赖关系,使代码松散耦合。