介绍情况
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就是解决循环依赖了呢
我最终的解决方案是这样的:生成sqlSessionFactory注入DynamicDataSource的时候用@Lazy懒加载。然后执行顺序就是,先创建sqlSessionFactory,最后创建DynamicDataDsource