首页 > 其他分享 >Springboot项目中注入bean失败的问题排查

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

时间:2023-02-16 18:11:13浏览次数:35  
标签:Springboot Autowired DI 排查 bean 注解 测试方法 注入

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

这是一个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

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

标签:Springboot,Autowired,DI,排查,bean,注解,测试方法,注入
From: https://www.cnblogs.com/touchTomorrow/p/17127785.html

相关文章

  • Spring的配置、依赖注入、Bean的自动装配及注解开发
    Spring配置1.别名alias设置别名,为bean设置别名,可以设置多个别名<!--设置别名:在获取Bean的时候可以使用别名获取--><aliasname="userT"alias="userNew"/>......
  • springboot基础配置yml
    yaml语法规则大小写敏感属性层级关系使用多行描述,每行结尾使用冒号结束使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)属性值前面添加空格(属性名与属......
  • springboot自定义校验工具类
    参考:https://betheme.net/news/txtlist_i120686v.html?action=onClickhttps://www.ngui.cc/el/2571188.html?action=onClick一、原生注解在springboot中,我们可以使用ja......
  • SpringBoot
    一.SpringBoot 1.1SpringBoot概述1.1.1什么是SpringBootSpringBoot是Spring项目中的一个子工程,与我们所熟知的Spring-framework同属于spring的产品:其最主......
  • springboot 使用微信支付
    参考:Java实现微信支付_被编程征服的秃发女子的博客-CSDN博客一.微信支付流程支付流程:用户点击支付按钮调用接口[/deposit]=>返回给小程序payInfo和订单编号orderNum......
  • 排查java进程问题
    1.先用jps命令查出java进程号2.使用top命令查出该进程使用cpu最高、占用内存最大的线程(嫌疑最大)这里我们选取微服务项目中的主进程24240top-Hp24240-d1-n13......
  • CAN总线错误帧及排查方法简介
    前言  CAN帧有多种格式,错误帧作为CAN帧中独特的一种,了解其作用,类型与产生原因,对于进行测试以及开发有很大的帮助,本文将对错误帧的相关基础知识以及后续的分析排查进行......
  • 前后端分离项目(vue+springboot)集成pageoffice实现在线编辑office文件
    前后端分离项目下使用PageOffice原理图集成步骤前端vue项目在您Vue项目的根目录下index.html中引用后端项目根目录下pageoffice.js文件。例如:<scripttype="text/......
  • SpringBoot集成MybatisPlus
    SpringBoot集成MybatisPlus一、依赖<properties><mybatis.plus.version>3.4.0</mybatis.plus.version></properties> <dependencies> ......
  • 记录一次线上docker排查服务cpu过高的操作
    线上CPU飙升,排查问题docker运行的mysql要在容器内找到线程ID进入docker容器dockerexec-it 容器IDbash容器内没有top命令,基于centos安装apt-getupdateapt-get......