在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注解

为什么不建议使用 @Autowired 注解进行注入的更多相关文章

  1. Spring @Autowired 注解自动注入流程是怎么样?

    面试中碰到面试官问:"Spring 注解是如果工作的?",当前我一惊,完了这不触及到我的知识误区了吗?,还好我机智,灵机一动回了句:Spring 注解的工作流程倒还没有看到,但是我 ...

  2. Spring中@Autowired 注解的注入规则

    默认根据类型,匹配不到则根据bean名字 1.声明一个service接口 public interface HelloService { void sayHello(); } 2.service接口的 ...

  3. 在servlet中使用@Autowired注解无法注入实例的问题

    今天在项目中碰到了一个奇怪的问题,原来的servlet中使用了HttpsWxService httpsWxService = new HttpsWxService()这一句代码,然后再HttpsWxS ...

  4. 解决 SpringMVC 非spring管理的工具类使用@Autowired注解注入DAO为null的问题

    在SpringMVC框架中,我们经常要使用@Autowired注解注入Service或者Mapper接口,我们也知道,在Controller层中注入service接口,在service层中注入其它的s ...

  5. 解决非controller使用@Autowired注解注入为null问题

    在SpringMVC框架中,我们经常要使用@Autowired注解注入Service或者Mapper接口,我们也知道,在controller层中注入service接口,在service层中注入其它的s ...

  6. spring boot 中@Autowired注解无法自动注入的错误

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/huihuilovei/article/de ...

  7. @Autowired注解与@Qualifier注解搭配使用----解决多实现选择注入问题

    问题:当一个接口实现由两个实现类时,只使用@Autowired注解,会报错,如下图所示 实现类1 实现类2 controller中注入 然后启动服务报错,如下所示: Exception encount ...

  8. Spring5:@Autowired注解、@Resource注解和@Service注解

    什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...

  9. Spring中@Autowired注解与自动装配

    1 使用配置文件的方法来完成自动装配我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. ...

  10. 04 Spring的@Autowired注解、@Resource注解、@Service注解

    什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事务,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...

随机推荐

  1. 【每日一题】【暴力、动态规划、动规优化、贪心】2022年1月21日-NC19 连续子数组的最大和/最大子序和

    同:最大子序和 https://www.cnblogs.com/liujinhui/p/15574312.html 描述输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组. ...

  2. Python数据类型+运算符

    Python基础数据类型 上期练习讲解 # 练习一.想办法打印出jason l1 = [11, 22, 'kevin', ['tony', 'jerry', [123, 456, 'jason'] ] ...

  3. 跟我学Python图像处理丨图像分类原理与案例

    摘要:本篇文章将分享图像分类原理,并介绍基于KNN.朴素贝叶斯算法的图像分类案例. 本文分享自华为云社区<[Python图像处理] 二十六.图像分类原理及基于KNN.朴素贝叶斯算法的图像分类案例 ...

  4. STM32外部中断(EXTI)控制LED亮灭的代码

    led.c #include "led.h" void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2P ...

  5. python 中变量的命名规则与注释

    变量命名规则 1.变量名必须是大小写英文字母.数字或下划线 _ 的组合,不能用数字开头,并且对大小写敏感 2.关键字不能用于命名变量,关键字一共有35个,以下为关键字的获取 注释 代码注释提高了代码的 ...

  6. week_9(推荐系统)

    Andrew Ng 机器学习笔记 ---By Orangestar Week_9(推荐系统) 1. Problem Formulation 这节就仅仅简单地介绍了一下 推荐系统的应用和实例.完全可以略 ...

  7. uniapp 打包app 引入高德地图

    一.高德地图注册key值 二.项目中添加配置 三.项目中引用 <view class="home-btom-box" > <view class="ho ...

  8. table表格的合并

    如上图,实现单元格合并功能,不多说,直接上代码 一,添加    :span-method="objectSpanMethod" <el-table :key="ti ...

  9. [Leetcode]寻找峰值

    题目 思路 如果常规解法不考虑时间复杂度,直接遍历即可得到峰值,时间复杂度为O(n),题目要求O(logn),因此我们需要使用二分法. 首先考虑题目要求:nums[-1]=nums[n]=-∞,因此在 ...

  10. 在统信UOS上将桌面窗口输出到Windows机器上的Xming

    目前所用版本是统信UOS V20,具体版本是家庭版22.0. 先尝试了一下,统信UOS自带的lightdm通过XDMCP无法正常输出到Windows机器上的Xming.VcXsrv.X Manager ...