大公司为什么禁止在SpringBoot项目中使用@Autowired注解?( 二 )


有一个有超过10个参数的构造函数是一个明显的信号,表明类已经转变一个大而全的功能合集,需要将类分割成更小、更容易维护的块 。
因此,尽管属性注入并不是破坏单一责任原则的直接原因,但它隐藏了信号,使我们很容易忽略这些信号 。
3.3 与依赖注入容器紧密耦合
使用基于字段的依赖注入的主要原因是为了避免getter和setter的样板代码或为类创建构造函数 。最后,这意味着设置这些字段的唯一方法是通过Spring容器实例化类并使用反射注入它们,否则字段将保持null 。
依赖注入设计模式将类依赖项的创建与类本身分离开来,并将此责任转移到类注入容器,从而允许程序设计解耦,并遵循单一职责和依赖项倒置原则(同样可靠) 。因此,通过自动装配(autowiring)字段来实现各类的解耦,最终会因为再次与类注入容器(在本例中是Spring)耦合而丢失,从而使类在Spring容器之外变得无用 。
这意味着,如果您想在应用程序容器之外使用您的类,例如用于单元测试,您将被迫使用Spring容器来实例化您的类,因为没有其他可能的方法(除了反射)来设置自动装配字段 。
3.4 隐藏依赖关系
在使用依赖注入时,受影响的类应该使用公共接口清楚地公开这些依赖项,方法是在构造函数中公开所需的依赖项,或者使用方法(setter)公开可选的依赖项 。当使用基于字段的依赖注入时,实质上是将这些依赖对外隐藏了 。
4. 总结
我们已经看到,基于字段的注入应该尽可能地避免,因为它有许多缺点,无论它看起来多么优雅 。推荐的方法是使用基于构造函数和基于setter的依赖注入 。对于必需的依赖,建议使用基于构造函数的注入,设置它们为不可变的,并防止它们为null 。对于可选的依赖项,建议使用基于sett的注入 。
5. 参考文档
Field injection is not recommended – Spring IOC by Marc Nuri
spring官方文档 1.4. Dependencies
 

原文:https://zhuanlan.zhihu.com/p/92395282




推荐阅读