详解@Autowired(required=false)注入注意的问题

 更新时间:2020年04月27日 11:52:09   作者:智_永无止境  
这篇文章主要介绍了@Autowired(required=false)注入注意的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、前言

在使用spring开发过程中,我们基本上都是使用@Autowired这个注解,用来注入已有的bean。但是有些时候,会注入失败。当我们加上参数(required=false)就能解决。今天整理一个我在实际开发中的例子

2、required属性

@Autowired(required=true):当使用@Autowired注解的时候,其实默认就是@Autowired(required=true),表示注入的时候,该bean必须存在,否则就会注入失败。

@Autowired(required=false):表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。

3、使用


我们的正常使用会在Controller层注入service,在service中注入mapper。

但是如果有一个公用方法,需要注入某个元素,并且这个方法在公用模块里。当该模块被引入其他项目中,该项目中并需要注入所需的bean时,就出现如图【2】的类似错误。那么问题来了,我们项目中并不需要该要注入的类,使得整个项目报错。

4、原因分析及解决

在容器的启动过程中,会初始化很多bean,这也是spring的核心之一(IOC)。但是在注入的过程中,扫描到公共方法中要注入的bean,并未找到,强行注入就会注入失败。我们又不能单独的去除改方法,所以我们采取的思想就是有bean就注入,没有就不注入。解决办法就是@Autowired(required=false)。

5、容器的父子关系

通过日志如图:

通过日志我们可以看到,容器的启动顺序。

  • 先加载父容器(spring),后加载子容器(springmvc)。所以在Controller里面注入service时,父容器中的bean已经初始化完毕,所以正常注入。
  • 在父子容器中,父容器元素对子容器可见,子容器对父容器的元素不可见。所以父容器中不能获取子容器的元素,但是子容器可以获取父容器的元素。
  • 当前容器均可获取当前容器中的元素,也就是说在service中可以注入其他service。

但是,当前容器不可以注入自己。这样就会不停的注入自己,陷入死循环。从而找不到要注入的bean。如图:


当然我们几乎不能这样坑自己,然而我就这么坑了自己。。。

 到此这篇关于@Autowired(required=false)注入注意的问题的文章就介绍到这了,更多相关@Autowired required=false注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解eclipse将项目打包成jar文件的两种方法及问题解决方法

    详解eclipse将项目打包成jar文件的两种方法及问题解决方法

    本文给大家介绍了eclipse中将项目打包成jar文件的两种方法及其遇到问题解决方法,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
    2017-12-12
  • Java实现Excel数据验证功能

    Java实现Excel数据验证功能

    在Java中,开发者可以使用一些开源的库(如Apache POI)来添加、修改和处理Excel中的数据,下面我们就来看看如何使用Java实现添加,修改和删除Excel数据验证吧
    2023-10-10
  • Spring计时器StopWatch的具体使用

    Spring计时器StopWatch的具体使用

    本文主要介绍了Spring计时器StopWatch的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • SpringCloud2020 bootstrap 配置文件失效的解决方法

    SpringCloud2020 bootstrap 配置文件失效的解决方法

    这篇文章主要介绍了SpringCloud2020 bootstrap 配置文件失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Springboot中的Validation参数校验详解

    Springboot中的Validation参数校验详解

    这篇文章主要介绍了Springboot中的Validation参数校验详解,Springboot参数校验是一种常用的验证机制,在传递参数时进行校验,以确保参数的有效性和正确性,该机制可以帮助开发者在代码实现前就避免一些常见的错误,需要的朋友可以参考下
    2023-10-10
  • Spring Boot 底层原理基础深度解析

    Spring Boot 底层原理基础深度解析

    这篇文章主要介绍了Spring Boot 底层原理基础,包括底层注解@Configuration,底层注解@Import及底层注解@Conditional的相关知识,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 详解基于IDEA2020.1的JAVA代码提示插件开发例子

    详解基于IDEA2020.1的JAVA代码提示插件开发例子

    这篇文章主要介绍了详解基于IDEA2020.1的JAVA代码提示插件开发例子,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java编程中的一些常见问题汇总

    Java编程中的一些常见问题汇总

    这篇文章主要介绍了Java编程中的一些常见问题汇总,本文总结的都是一些Java代码中比较典型的错误,需要的朋友可以参考下
    2014-09-09
  • java 中设计模式之单例

    java 中设计模式之单例

    这篇文章主要介绍了java 中设计模式之单例的相关资料,这里说明恶汉模式与懒汉模式,需要的朋友可以参考下
    2017-08-08
  • 详解Java打包及上传到私服务的方法

    详解Java打包及上传到私服务的方法

    这篇文章主要介绍了Java打包及上传到私服务的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01

最新评论