在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. 4.2:Scrapy爬虫

    使用Scrapy框架对网站的内容进行爬取 在桌面处打开终端,并在终端中输入: scrapy startproject bitNews cd bitNews/bitNews 修改items文件的内容,输 ...

  2. form表单里的button 等元素不能使用margin: 0 auto;

    记得把form和button都设为display:block; 就能用margin: 0 auto;水平居中了

  3. Spring 6 源码编译和高效阅读源码技巧分享

    一. 前言 Spring Boot 3 RELEASE版本于 2022年11月24日 正式发布,相信已经有不少同学开始准备新版本的学习了,不过目前还不建议在实际项目中做升级,毕竟还有很多框架和中间件没 ...

  4. Karmada多云多集群生产实践专场圆满落幕

    摘要:CNCF Karmada社区Cloud Native Days China 2022南京站成功举办. 本文分享自华为云社区<Karmada多云多集群生产实践专场圆满落幕|Cloud Nat ...

  5. 巧如范金,精比琢玉,一分钟高效打造精美详实的Go语言技术简历(Golang1.18)

    研发少闲月,九月人倍忙.又到了一年一度的"金九银十"秋招季,又到了写简历的时节,如果你还在用传统的Word文档寻找模板,然后默默耕耘,显然就有些落后于时代了,本次我们尝试使用云平台 ...

  6. python文件的写入与读出

    Python对文件的处理,新建目录,写入一个txt文件然后读取刚才写入的内容.这里是在windows系统演示,目录用"\".如果在linux系统,区别就是目录的斜杠号要用" ...

  7. 字符编码:Unicode & UTF-16 & UTF-8

    ASCII码 使用一个字节(8位),对128个字符进行编码: 最高位始终为0: 码数范围为0000_0000(0x00)到0111_1111(0x7F): Unicode 开始的编码设计 使用两个字节 ...

  8. [机器学习] PCA (主成分分析)详解

    转载于https://my.oschina.net/gujianhan/blog/225241 一.简介 PCA(Principal Components Analysis)即主成分分析,是图像处理中 ...

  9. [深度学习] fast-reid入门教程

    fast-reid入门教程 ReID,全拼为Re-identification,目的是利用各种智能算法在图像数据库中找到与要搜索的目标相似的对象.ReID是图像检索的一个子任务,本质上是图像检索而不是 ...

  10. 无旋树堆(FHQ-Treap)学习笔记

    简介 无旋树堆(一般统称 \(\text{FHQ-Treap}\)),是一种平衡树.可以用很少的代码达到很优秀的复杂度. 前置知识: 二叉搜索树 \(\text{BST}\) \(\text{Trea ...