这是一个Spring常见的问题,下面我们从测试方法和普通方法出问题两个角度来下如何解决
测试方法
先查看目录是否有误
测试类的包名一定要和启动类的包名一致 。
这里盗用一张图,为了避免这个错误我的测试方法大多都是Alt+insert自动生成大体测试框架。
继承被测试方法
我们可以通过直接在测试方法上继承对应的被测试类来确保注入Bean成功
普通方法
普通方法解决该问题的内容测试方法同样适用
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(使用前将#替换为@)