启动报错:Error creating bean with name 'dataSource': Requested bean is currently in creation: Is there an unresolvable circular reference?

翻译过来的意思就是:创建bean“dataSource”报错:需要的bean正在被创建:是否有一个没解决的循环依赖?

更通俗点的解释就是:因为循环依赖的问题导致“dataSource”这个bean无法被创建。

那么我们首先想到的是“到底是哪里出现了循环依赖?

最直接的方式是看启动日志。

从上往下读异常信息是:创建myshiroRealm失败——因为需要的类userServerImp创建失败——因为userDao创建失败——因为userMapper创建失败——因为SQLSessionFactory创建失败——因为dataSource创建失败——因为mydateSource失败——因为datasourceInitializer创建失败——因为dataSource创建失败——因为dataSource正在被创建——因为循环依赖。

那么问题就很明显了:创建dataSource的时候需要先创建dataSource!!!

这时我们会有第二个问题“为什么在引入了shiro之后会出现这个问题?

回到上面的过程,我们知道在在初始化myshiroRealm的时候需要用到数据库(基于其它方式访问数据的realm,不在讨论范围),于是不可避免的用到dataSource。如果在初始化shiroRealm的时候容器没有dataSource,容器就会为我们创建一个,于是就有了我们看到的循环依赖的问题。

那么我们会想“如果在初始化shiroRealm的时候,容器已经有了dataSource,就不会有循环依赖的问题

这时就有了第三个问题“如何在初始化shiroRealm之前,让容器已经拥有dataSource?

我的方法是让shiroRealm初始化的时候某个类变成“懒加载”。如下:

@Resource(name="userServerImp")

@Lazy 

UserServer userServer;