No qualifying bean of type或Unsatisfied dependency expressed through field ‘XXXService‘或@Autowired 注入

这种类似的bean报错基本都是因为bean使用自动注入的时候没有成功注入,可以解决的方法有

1.对象没有被加载到容器

首先要看要加载的类上有没有对应的注解@Controller、@Service、@Mapper、@Repository、 @Component(一些工具类等可以加)、@Configuration

@Mapper和@Repository区别

  • @Mapper和@Repository都是用在dao层接口的上的注解
  • @Mapper可以单独加在dao层接口类上,使得该类直接加载。如果有多个mapper需要加载则可以启动类上配置@MapperScan
  • @Repository单独使用没有用,只是给该mapper接口作为标识,想要被加载到需要用@MapperScannerConfigurer扫描

2.对象没有被扫描到

如果对应的对象已经加上了对应的注解,但还是报错,则可能是因为启动类上没有加上@MapperScan或者@ComponentScan导致因此导致对象没有被扫描到,无法加载到容器中。没有加上的话在启动类加上即可

@MapperScan和@ComponentScan区别

  • 两个Scan不能同时使用,否则mapper会扫描不到,如果非要同时使用则需要@MapperScan(basePackages = {})使@MapperScan只扫描mapper包
  • @MapperScan只扫描Mapper接口的类
  • 而@ComponentScan会扫描@Controller、@Service、@Repository、@Component类等类装配到spring容器中

本次博主出错就是因为两个项目之间要调用service类但只使用了@MapperScan,因此无法进行加载,改成@ComponentScan即可,而@ComponentScan的话扫描的包记得范围需要大一点否则也会报错

3.注意包的层级

如果是测试类上进行测试的时候,要注意测试类的包层级和原先java包下的层级要对应上

4.对象不是由spring加载,而是new来创建

需要注入的对象通常是只需要声明而不需要创建,创建的工作是交给spring的IOC容器来操作,一般加上了static等的操作可能就是已经创建了

5.一个项目里有多个子项目,且每个子项目都有启动类的

注意:通常相同层级的子项目的启动类上扫描只能有一个@ComponentScan在扫描,有两个会发生冲突

No qualifying bean of type或Unsatisfied dependency expressed through field ‘XXXService‘或@Autowired 注入_第1张图片

 

你可能感兴趣的:(杂谈,java,开发语言,spring,boot,分布式)