Springboot项目中注入bean失败的问题排查

2023-11-20

这是一个Spring常见的问题,下面我们从测试方法和普通方法出问题两个角度来下如何解决

测试方法

先查看目录是否有误

测试类的包名一定要和启动类的包名一致 。

这里盗用一张图,为了避免这个错误我的测试方法大多都是Alt+insert自动生成大体测试框架。

img

继承被测试方法

我们可以通过直接在测试方法上继承对应的被测试类来确保注入Bean成功

image-20230216165628080

普通方法

普通方法解决该问题的内容测试方法同样适用

DI配置注解使用有误

检查是否配置包扫描注解 @ComponentScan

@ComponentScan:该注解添加在启动类上,相当于xml配置中的<context:component-scan base-package=“”/> ,注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式{ },如:

@ComponentScan(basePackages = {"com.xuecheng.system","com.xuecheng.web","com.xuecheng.mybatis"}) // 指定启动类包扫描范围

注意:spring只会扫描basePackages做在的包。把相关配置和依赖纳入容易。默认不写的话为包名为springboot启动类Applications所在包

检查是否实例化Bean到Spring容器内

此处注解添加在DI对应类上

  • @Component
    用于实例化对象,相当于配置文件中的<bean id=“” class=“”/>
    它支持一个属性value,相当于xml中bean的id,如果不写,默认值为类名的首字母小写

  • @Controller @Service @Repository
    这三个注解的功能跟@Component类似,他们分别标注在不同的层上。
    @Controller 标注在表现层(servlet/collecter)的类上
    @Service 标注在业务层(service)的类上
    @Repository 标注在持久层(dao/mapper)的类上,这里我更喜欢用MyBatis提供的@Mapper注解
    实例化时推荐使用这三个更见名知意的,当一个类实在不好归属在这三个层上时,再使用@Component

DI注入有问题

当我们保证上述没有问题时,我们应该考虑是我们DI注入注解有问题,常用的注入DI注解有

  • @Autowired
    根据类型将ioc容器中的对象实例注入进来,按类型装配,相当于:ioc.getBean(Class类型),该属于暴力反射可省略set方法

  • @Qualifier(名称)
    需要与@Autowired一起使用,相当于按名称装配,根据id+类型将ioc容器的对象实例注入进来,相当于:ioc.getBean(id,Class类型)

  • @Resource
    java提供的注解,相当于@Autowired+@Qualifier,相当于按名称装配,但不建议使用

我们从最常用的@Autowired看起

@Autowired

先说错误的、无效的操作,这两个操作只能去掉注入失败的红色下划线,是经典的掩耳盗铃

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot项目中注入bean失败的问题排查 的相关文章

随机推荐

  • sh、bash 和 dash 几种 shell 的区别是什么?

    在调试基于 Debian 的 Docker 镜像时 进入容器后在终端中按上箭头键后终端显示 A 下箭头显示 B 右箭头显示 C 左箭头显示 D 按删除键也是显示了几个特殊字符 很奇怪 仔细看了一下 原来进入容器的时候终端使用的 sh 切换为
  • iPhone惊爆史诗级漏洞:亿万台手机可永久越狱 苹果无法修复

    在我认为完美越狱已死的时候没想到国外大神爆出了一个 不可修补 iPhone漏洞 这个漏洞会让iPhone永久越狱从iPhone 4S到iPhone X的所有设备均会受到影响 但是目前还是不支持A12芯片的 据发现它的安全研究员axi0mX称
  • C++实现大数运算(加减乘除求余)

    前言 只有部分GCC编译器支持int128 而我们平常使用的软件 最大只有 int64 当这些不够用时 我们该怎么办 我本身想写代码实现整数型大数据的加减乘除和求余 结果写着写着想着连小数运算的也一起写上 反正加的代码不多 电脑是死的 人是
  • 报错解决:No module named tensorflow.contrib

    今天在跑代码的时候发现一个报错 如下图所示 于是乎我就按照下面的提示安装啊 可惜的是 无效 然后我就去查了下自己的TensorFlow版本 是1 15 再看了下Readme md 怀疑是不是版本太高了 想到就做 换了个低版本的TensorF
  • ruoyi(若依)分离版框架,FluentMybatis封装后,导入功能的前后端实现

    我这里使用的是车辆来作为示例 首先是前端 导入按钮 点击导入按钮后的对话框 导入的一系列方法 下面是后端 Controller层 我们使用了FluentMybatis进行了封装 mapper层被封装了 但会有一些封装好的方法 我们只要 利用
  • vue 项目中使用高德地图

    官方文档 高德地图API官网 高德地图2 0参考手册 高德地图JS API 2 0 示例 在项目中使用 vue amap 高德地图JSAPI在Vue框架下使用 高德地图在线 JS API 示例 一 账号准备 首先 需要注册并登录高德地图开放
  • uni-app 之 表格设置

    uni app 之 表格设置 image png
  • QT connect()连接函数

    函数重载 连接函数后多种重载方法 常用的有 函数4个参数 发射信号的对象 发射的信号 接受信号的对象 要执行的槽 按键单击信号连接到按键槽函数 方法1 connect ui gt pushButton SIGNAL clicked bool
  • java与C++之间的区别

    前言 研究生期间主要使用的是C 语言 因工作的要求 现在需要学习java语言 在学习的这段时间里 发现两种语言之间有着很多相似的地方 但又有一些区别 下面说一下java和c 中比较显著的区别 适用于有c 基础的读者 一 在数据类型 关键字方
  • 销售人员的月工资数量(月工资=基本工资+提成,提成=商品数*1.5)

    include
  • mfc窗口创建的create与oncreate

    在view类中 create 是虚函数由框架调用 是用来 生成一个窗口的子窗口 oncreate 消息响应函数 是用来 表示一个窗口正在生成 某个CWnd的Create函数由当前CWnd的Owner调用 而在CWnd Create中 又会调
  • JDBC乱码解决方法

    JDBC操作数据库出现中文乱码解决方案 学习JDBC的时候 我不止一次碰到过数据库中文乱码问题 解决方法其实很简单 在配置文件的url中加入如下语句就ok了 useUnicode true characterEncoding utf8 出现
  • MySQL幻读:大家好,我是幻读,我今天又被解决了

    什么是幻读 幻读的定义我这里还得补充一句 幻读仅专指 新插入的行 中途通过 update 更新数据而出现同一个事务前后两次查询的 结果集合 不一样 这种不算幻读 然后前几天有位读者跟我说 这个幻读例子不是已经被 可重复读 隔离级别解决了吗
  • localStorage和sessionStorage和Cookie的区别

    localStorage和sessionStorage和Cookie是前端开发中三种常见的临时存储客户端会话信息或者数据的方法 它们都存储在客户端中 区别 一 三者存储的有效时期不同 1 Cookie存储的有效时期可以设置 一般在浏览器关闭
  • 实战wxPython:042 - 高级控件之选项卡Notebook

    在wxPython中 book控件允许用户在各种面板之间切换 最常见的例子是带有选项卡界面的浏览器和系统选项对话框 选项卡wx Notebook提供了一个选项卡栏和一个 页面区域 该页面区域用于显示与每个选项卡相关的页面 默认情况下 选项卡
  • Anaconda下载速度慢,用清华镜像

    Anaconda在官网下载速度慢 关键是下载到一半就没了 清华镜像相对还是要好一点 以下网址持续更新 https mirrors tuna tsinghua edu cn anaconda archive
  • 获取openwrt wan口ip方法

    2020年7月30日14点39分 更新 之前写的方法 获取的是wan口的ip和网关 使用过程发现 以有线上网模式为例 获取wan口网关时 若网关中出现连续的1 1 会获取失败 表明该正则表达式是有问题的 即下面这个grep oE 之后的内容
  • linux c/c++ 面试题目整理(一)

    1 求下面函数的返回值 int func x int countx 0 while x countx x x x 1 return countx 问 假定x是9999 那么返回多少 答 返回的是8 解题思路是将x转化为二进制 看含有多少个1
  • 7-7 12-24小时制 (15分)

    7 7 12 24小时制 15分 编写一个程序 要求用户输入24小时制的时间 然后显示12小时制的时间 输入格式 输入在一行中给出带有中间的 符号 半角的冒号 的24小时制的时间 如12 34表示12点34分 当小时或分钟数小于10时 均没
  • Springboot项目中注入bean失败的问题排查

    这是一个Spring常见的问题 下面我们从测试方法和普通方法出问题两个角度来下如何解决 测试方法 先查看目录是否有误 测试类的包名一定要和启动类的包名一致 这里盗用一张图 为了避免这个错误我的测试方法大多都是Alt insert自动生成大体