一、关于解决required a bean of type ‘XXX’ that could not be found.的问题
报错信息:Parameter 0 of constructor in com.opengauss.exam.user.service.UserService required a bean of type 'com.opengauss.exam.user.dao.UserDao' that could not be found.
可能问题有三种:
1、没有给对应的DAO接口注入@Mapper属性
通常这个问题是有可能是忘记了或者粗心大意所遇到的,也是比较的简单,直接添加@Mapper就可以解决了
2、Mapper引入的时候引入错了包
有时候就是同样的引入的Mapper里面,引入的不是我们需要的Mybatis,所以出现找不到的情况,这种情况确实不太好定位,因为这也很难看出来。
注意这个@Mapper是不能引入成别的的了
3、包扫描不到!
(1)是主启动类的报名和你的Bean文件的包裹问题
看到网上有这种情况:
注意,我的Bean文件的包名是“org.Choiridong.Security.DAO”,但是!!!重点来了,如果你的启动类是这样子的(我之前启动类就是这样)“org.Choiridong.web”
请注意,这样子就会有问题,据我了解,之前看到资料是说,主类只会扫面主类文件下面的包,所以,我的Bean文件自然是没有办法扫到的,他只能扫到“org.Choiridong.web”之后的部分,所以把主类名字改成“org.Choiridong”改成这样子之后,就可以了
(2)忽略了 数据层的扫描
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
由于刚启动项目的时候没有数据里连接,所以报错了,就加了上述注解,忽略了数据层的扫描。把上述配置去掉改成 @SpringBootApplication 即可。
二、@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})注解作用
exclude,排除此类的AutoConfig,即禁止 SpringBoot 自动注入数据源配置。
DataSourceAutoConfiguration.class 会自动查找 application.yml 或者 properties 文件里的 spring.datasource.* 相关属性并自动配置单数据源「注意这里提到的单数据源」。
那么问题来了,排除了自动配置,Spring还怎么识别到数据库配置呢?
答:显然接下来就需要手动配置,what?那我为什么要排除?然后手动指定数据源?
如果你发现项目中存在这个排除的骚操作,可以在项目中搜一下Java关键字@ConfigurationProperties("spring.datasource ,你可能会发现手动配置数据源的类。
再来回答为何要手动配置数据源,因为要配置多数据源,上边有提到DataSourceAutoConfiguration.class默认会帮我们自动配置单数据源,所以,如果想在项目中使用多数据源就需要排除它,手动指定多数据源。
三、@Mapper和@Repository注解的区别
在用idea写一个实现类时调用了dao层的处理,使用@Autowired注解时被标红线,找不到bean。
解决办法:在dao加@mapper或者@repository注解。
这两种注解的区别在于:
1、使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。
2、@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中。