在Spring中,Bean的注入一般有三种方式:属性注入、set方法注入、构造器注入。

1、Autowired注入的原理

@Autowired属于属性注入,默认按照类型装配,默认情况下要求依赖的对象必须存在,不过可以通过@Autowired(required = false)来解决这一问题

2、Autowired存在的问题

2.1 不能使用final修饰符

在使用Autowired修饰属性之后,这一属性我们就不能再用final修饰符修饰了,但是一个好的软件设计是希望我们在合适的地方尽可能使用final的,除非变量必须是可变的。因此@Autowired注解的使用条件就显然与这一原则相违背了。

2.2 破坏了单一职责原则

虽然使用属性注入很方便,这也造成了引入依赖过多时不够明显,因为添加一个属性不需要太多额外的代码。 假设我需要添加六个、十个甚至十几个依赖项,使用属性注入,我们很少关心是否违反了SRP原则。 反之用构造器注入代码很快就会显得十分庞大,有太多的依赖通常意味着这个类有太多的职责。 这时候应该考虑一下此组件是不是违反了单一职责原则。

2.3 与依赖注入容器紧密耦合

使用基于字段的注入函数的话是为了避免大规模的使用getter和setter方法,这也就间接导致我们除了Spring容器外没有其他的生成对象的方法,使得我们在test类中也必须大规模使用Spring容器来处理。

3、对应的解决方案

使用@Resource注解

最新文章

  1. begin
  2. SQL Server 数据库镜像
  3. Genymotion 解决虚拟镜像下载速度特别慢的问题
  4. 利用 PortableBasemapServer 发布地图服务
  5. maven之ubutu安装
  6. Ubuntu15.04 安装Android开发环境
  7. Nginx之负载均衡
  8. java 读取文件到String(解决中文乱码)
  9. D-Separation(D分离)
  10. 【APP问题定位(一)】夜神模拟器安装及问题
  11. react native 项目版本升级
  12. 复习java基础
  13. guxh的python笔记五:面向对象
  14. Deploy Descriptor
  15. 小强学渲染之OpenGL状态机理解
  16. ethereum & ETC
  17. 每日英语:The Delicate Protocol Of Hugging
  18. JavaScript模块化-RequireJs实现AMD规范的简单例子
  19. python学习笔记——multiprocessing 多进程模块Process
  20. Android Looper详解

热门文章

  1. Vue快速上门(3)-组件与复用
  2. 使用docker中的MySQL
  3. python 错误之TypeError: XXXXX() takes no keyword arguments
  4. python 中变量的命名规则与注释
  5. vue 组件之间传值(父传子,子传父)
  6. 一个sql和C#代码结合的分组求和的查询
  7. [深度学习] imgaug边界框增强笔记
  8. OI是什么?
  9. [WPF]创建系统栏小图标
  10. [Leetcode] 寻找数组的中心索引