springboot 数据源依赖于mapper 导致循环引用报错
介绍情况
springboot项目,mybatis-plus 持久层框架
DynimcDatasource 依赖于 Mapper
Mapper 依赖于 SqlSessionFoctory
SqlSessionFactory 依赖于 DynimcDatasource
循环依赖报错 The dependencies of some of the beans in the application context form a cycle:
DynimcDatasource -> Mapper -> SqlSessionFoctory -> DynimcDatasource
bean生成方式
@Component
public class DynimcDatasource{
@Resource
private Mapper mapper;
@PostConstruct
public void init() {
mapp.list();
...
}
...
}
@Mapper
public interface Mapper extends BaseMapper<XXX>{
}
@Configuration
public class xxxConfig{
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(DynamicDataSource
dynamicDataSource)
throws Exception {
MybatisSqlSessionFactoryBean bean = new
MybatisSqlSessionFactoryBean();
bean.setDataSource(dynamicDataSource);
bean.setTransactionFactory(new
MultiDataSourceTransactionFactory());
return bean.getObject();
}
}
奇怪的一个地方:
我在其他地方注入DynimcDatasource,和 Mapper之后,spring就能处理循环依赖了,
注入方式如下
@Configuration
public class xxxConfig{
@Resource
private DynimcDatasource dynimcDatasource;
@Resource
private Mapper mapper;
}
求解释原因。
并求问是否有更好的接触方案,感觉这么弄有点丑。
解决:循环引用的一个节点上注入对象时加@Lazy可以解决循环引用问题
@Configuration
public class xxxConfig{
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Lazy DynamicDataSource
dynamicDataSource)
throws Exception {
MybatisSqlSessionFactoryBean bean = new
MybatisSqlSessionFactoryBean();
bean.setDataSource(dynamicDataSource);
bean.setTransactionFactory(new
MultiDataSourceTransactionFactory());
return bean.getObject();
}
}
保留的疑问:在不使用@Lazy时,为什么我在其他对象中注入了DynimcDatasource 和 Mapper 之后,spring就是解决循环依赖了呢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我最终的解决方案是这样的:生成sqlSessionFactory注入DynamicDataSource的时候用@Lazy懒加载。然后执行顺序就是,先创建sqlSessionFactory,最后创建DynamicDataDsource
orm框架依赖数据源,数据源的优先级较高,然后你数据源里面又依赖orm框架的类,这不是无限套娃嘛!设计就有问题,先问问自己为什么要这么设计,如果只是为了初始化一部分数据,容器提供了一大堆扩展点
spring 是解决了循环依赖的问题的,除非你使用的是构造器注入的方式,才会出现循环依赖的报错。如果使用的是setter,字段注入的方式,并且bean是单例,spring 提供循环依赖的问题解决。我去测试了下,确实是可以解决。你可以关注下注入的方式。