文档章节

spring循环引用

Turman
 Turman
发布于 2015/11/12 11:52
字数 522
阅读 411
收藏 0

在配置shiro的时候出了这么个问题:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'shiroFilter' defined in class path resource [shiro/applicationContext-shiro.xml]: 
BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#5': 
Cannot resolve reference to bean 'druid-stat-pointcut' while setting bean property 'pointcut'; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'druid-stat-pointcut' defined in class path resource [applicationContext.xml]: 
BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor#0' defined in class path resource 
[shiro/applicationContext-shiro.xml]: Cannot resolve reference to bean 'securityManager' while setting bean property 'securityManager'; 
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityManager' 
defined in class path resource [shiro/applicationContext-shiro.xml]: Cannot resolve reference to bean 'userRealm' while setting bean property 'realm'; 
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRealm': I
njection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: 
Error creating bean with name 'usersServiceImpl': Bean with name 'usersServiceImpl' has been injected into other beans 
[wxEchoMpMessageRouter,wxEchoMpMessageHandler,dutyDaoImpl,fileManageServiceImpl] in its raw version as part of a circular reference, but has eventually 
been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider 
using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.

大致的意思是,在userRealm中注入了usersService,而在userService中注入了dutyService等几个service,但是同时在这几个service中也注入了usersService,所以产生了循环注入的问题。但是这个问题在没有配置userRealm之前是没有出现过的。以上报错在最后给出了改正的提示,依据提示找到了一篇博客:http://blog.xiaocaihua.com/archives/2010/10/problem-of-spring-circle-reference.html.

解决的办法大致是定义一个webapplicationcontext对象继承自Xmlwebapplicationcontext,将其中的AllowRawInjectionDespiteWrapping设置为true。

public class MyWebApplicationContext extends XmlWebApplicationContext {
    @Override
    protected DefaultListableBeanFactory createBeanFactory() {
        DefaultListableBeanFactory beanFactory =  super.createBeanFactory();
        beanFactory.setAllowRawInjectionDespiteWrapping(true);
        return beanFactory;
    }

}

web.xml中添加:

<context-param>
        <param-name>contextClass</param-name>
        <param-value>xxx.MyWebApplicationContext</param-value>
</context-param>

问题解决,对博主的感激之情无以言表啊!


但是,这里有几个问题:

  1. 为什么在没有配置userRealm之前没有暴露这个循环引用的问题。

  2. 对于这个问题最正确的解决办法是将相关的Service解耦,但是,对于像dutyService和dutyService这样的相互调用我觉得是比较正常的,如果直接调用底层的Dao实在比较麻烦,而且会造成很多的重复代码!


笔记,完


© 著作权归作者所有

Turman
粉丝 6
博文 36
码字总数 19221
作品 0
杨浦
程序员
私信 提问
spring循环依赖的三种方式

1.构造器参数循环依赖 对象间在构造函数中有相互依赖,通过构造函数注入 constructor-arg 启动是会报循环依赖错误 2.setter方式单例,默认方式 spring先通过无参构造方法创建bean,然后通过s...

素雷
2018/08/08
151
0
Spring是怎么解决循环依赖的

什么是循环依赖? 循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图: 注意,这里不是函数的循环调用,是对...

Jack1991
2018/04/27
225
0
【第三章】 DI 之 3.2 循环依赖 ——跟我学spring3

3.2.1 什么是循环依赖 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环。此处不是...

azikaxu
2015/04/15
123
0
Spring 源码(八)循环依赖

循环依赖是指两个或者多个Bean之前相互持有对方。在Spring中循环依赖一般有三种方式: 构造函数循环依赖 setter方法循环依赖 prototype 范围的依赖处理 构造函数循环依赖 在Spring中构造函数...

xiaolyuh
09/28
1K
1
利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired

大家平时使用spring依赖注入,都是怎么写的? 是不是很熟悉的感觉?但是呢 如果你用IDEA的话呢,它会提示你 Field injection is not recommended 大概就是spring 不推荐建使用这个方式。原因...

HeyS1
2018/09/26
3.3K
22

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部