Spring Bean相互注入 java.lang.StackOverflowError Requested bean is currently in creation: Is there an u
来源:互联网 发布:python创建元组 编辑:程序博客网 时间:2024/05/22 07:14
总述:Spring 相互引用注入会报错
不要构建成bean1引用bean2,然后bean2直接引用bean1或者间接引用bean1的情况,Spring 会报错,会造成bean的调用形成死循环
如果使用构造器注入,Requested bean is currently in creation: Is there an unresolvable circular reference?
如果使用set方法注入,java.lang.StackOverflowError
测试代码结构
1、service
SpringBeanOneService.java
package com.bestcxx.stu.springmvc.bean.testservice;public interface SpringBeanOneService {public void testOne();}
SpringBeanTwoService.java
package com.bestcxx.stu.springmvc.bean.testservice;public interface SpringBeanTwoService {public void testTwo();}
2、serviceImpl
这里需要进行说明,由于bean的声明可以是<bean>或者扫描试,注入方式可以是构造方法式、set 方式和 @Autowired 方法,所以不再全部列举
SpringBeanOneServiceImpl.java
package com.bestcxx.stu.springmvc.bean.test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.bestcxx.stu.springmvc.bean.testservice.SpringBeanOneService;import com.bestcxx.stu.springmvc.bean.testservice.SpringBeanTwoService;@Servicepublic class SpringBeanOneServiceImpl implements SpringBeanOneService {@Autowired(required=false)private SpringBeanTwoService springBeanTwoService;//构造方法注入/*public SpringBeanOneServiceImpl(SpringBeanTwoService springBeanTwoService) {this.springBeanTwoService=springBeanTwoService;}*///setter 注入/*public SpringBeanTwoService getSpringBeanTwoService() {return springBeanTwoService;}public void setSpringBeanTwoService(SpringBeanTwoService springBeanTwoService) {this.springBeanTwoService = springBeanTwoService;}*/@Overridepublic void testOne() {springBeanTwoService.testTwo();}}
SpringBeanTwoServiceImpl.java
package com.bestcxx.stu.springmvc.bean.test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.bestcxx.stu.springmvc.bean.testservice.SpringBeanOneService;import com.bestcxx.stu.springmvc.bean.testservice.SpringBeanTwoService;@Servicepublic class SpringBeanTwoServiceImpl implements SpringBeanTwoService {@Autowired(required=false)private SpringBeanOneService springBeanOneService;//构造方法注入/*public SpringBeanTwoServiceImpl(SpringBeanOneService springBeanOneService) {this.springBeanOneService=springBeanOneService;}*///setter 注入/*public SpringBeanOneService getSpringBeanOneService() {return springBeanOneService;}public void setSpringBeanOneService(SpringBeanOneService springBeanOneService) {this.springBeanOneService = springBeanOneService;}*/@Overridepublic void testTwo() {springBeanOneService.testOne();}}
3、applicationContext-bean.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd "> <!-- bean 相互引用实验,构造方法注入-启动失败--> <!-- <bean id="springBeanOneService" class="com.bestcxx.stu.springmvc.bean.test.SpringBeanOneServiceImpl"> <constructor-arg ref="springBeanTwoService" name="springBeanTwoService"></constructor-arg> </bean> <bean id="springBeanTwoService" class="com.bestcxx.stu.springmvc.bean.test.SpringBeanTwoServiceImpl"> <constructor-arg ref="springBeanOneService" name="springBeanOneService"/> </bean> --> <!-- bean 相互引用实验,set方法注入-启动失败 --> <!-- <bean id="springBeanOneService" class="com.bestcxx.stu.springmvc.bean.test.SpringBeanOneServiceImpl"> <property ref="springBeanTwoService" name="springBeanTwoService"/> </bean> <bean id="springBeanTwoService" class="com.bestcxx.stu.springmvc.bean.test.SpringBeanTwoServiceImpl"> <property ref="springBeanOneService" name="springBeanOneService"/> </bean> --> <!-- bean 相互引用实验, autowire="byName" --> <!-- <bean id="springBeanOneService" class="com.bestcxx.stu.springmvc.bean.test.SpringBeanOneServiceImpl"/> <bean id="springBeanTwoService" class="com.bestcxx.stu.springmvc.bean.test.SpringBeanTwoServiceImpl"/> --> <!-- 定向扫描 @service 注册为bean --> <context:component-scan base-package="com.bestcxx.stu.springmvc.bean.test"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/> </context:component-scan></beans>
4、测试方法
SpringBeanOneServiceImplTest.java
package com.bestcxx.stu.springmvc.bean.test;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.annotation.DirtiesContext;import org.springframework.test.annotation.Rollback;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.bestcxx.stu.springmvc.bean.testservice.SpringBeanOneService;@DirtiesContext@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations={"classpath:test/applicationContext-bean.xml"})//@TransactionConfiguration(transactionManager = "defaultTransactionManager",defaultRollback=false)//事务管理 @Rollback(true)public class SpringBeanOneServiceImplTest {@Autowired(required=false)private SpringBeanOneService springBeanOneService;@Testpublic void testTestOne(){springBeanOneService.testOne();}}
运行结果
报错,会造成循环引用
异常类型一
java.lang.IllegalStateException: Failed to load ApplicationContextat org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117)at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springBeanOneService' defined in file [D:\softwareplace\eclipsePlaceForMarsTest\springmvc\target\classes\applicationContext\applicationContext-bean.xml]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'springBeanTwoService' defined in file [D:\softwareplace\eclipsePlaceForMarsTest\springmvc\target\classes\applicationContext\applicationContext-bean.xml]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'springBeanOneService': Requested bean is currently in creation: Is there an unresolvable circular reference?; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'springBeanOneService': Requested bean is currently in creation: Is there an unresolvable circular reference?; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springBeanTwoService' defined in file [D:\softwareplace\eclipsePlaceForMarsTest\springmvc\target\classes\applicationContext\applicationContext-bean.xml]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'springBeanOneService': Requested bean is currently in creation: Is there an unresolvable circular reference?; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'springBeanOneService': Requested bean is currently in creation: Is there an unresolvable circular reference?at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:775)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:128)at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:108)at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:251)at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)... 25 moreCaused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springBeanTwoService' defined in file [D:\softwareplace\eclipsePlaceForMarsTest\springmvc\target\classes\applicationContext\applicationContext-bean.xml]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'springBeanOneService': Requested bean is currently in creation: Is there an unresolvable circular reference?; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'springBeanOneService': Requested bean is currently in creation: Is there an unresolvable circular reference?at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:187)at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1208)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1048)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1018)at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:834)at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)... 43 moreCaused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'springBeanOneService': Requested bean is currently in creation: Is there an unresolvable circular reference?at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:347)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:187)at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1208)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1048)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1018)at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:834)at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)... 58 more
异常类型二
java.lang.StackOverflowErrorat com.bestcxx.stu.springmvc.bean.test.SpringBeanTwoServiceImpl.testTwo(SpringBeanTwoServiceImpl.java:20)at com.bestcxx.stu.springmvc.bean.test.SpringBeanOneServiceImpl.testOne(SpringBeanOneServiceImpl.java:23)at com.bestcxx.stu.springmvc.bean.test.SpringBeanTwoServiceImpl.testTwo(SpringBeanTwoServiceImpl.java:20)at com.bestcxx.stu.springmvc.bean.test.SpringBeanOneServiceImpl.testOne(SpringBeanOneServiceImpl.java:23)at com.bestcxx.stu.springmvc.bean.test.SpringBeanTwoServiceImpl.testTwo(SpringBeanTwoServiceImpl.java:20)at com.bestcxx.stu.springmvc.bean.test.SpringBeanOneServiceImpl.testOne(SpringBeanOneServiceImpl.java:23)......N行
阅读全文
0 0
- Spring Bean相互注入 java.lang.StackOverflowError Requested bean is currently in creation: Is there an u
- Initialization of bean failed; nested exception is java.lang.StackOverflowError
- nested exception is java.lang.IllegalStat eException:duplicate spring bean
- There is already '******' bean method
- There is already 'baseController' bean method spring方法重定义
- There is already 'xxxxx' bean method
- There is no READABLE property named 'day' in class 'java.lang.String';You have an error in your SQL
- spring quartz:Instantiation of bean failed; nested exception is java.lang.IncompatibleClassChangeErr
- Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError
- Servlet *** is currently unavailable/java.lang.ClassNotFoundException
- Bean 'shiroFilter'; nested exception is java.lang.IllegalArgumentException: Bean name must not be em
- spring 循环注入:is there an unresolvable circular reference的解决方案
- Java Spring Tutorial -- 注入Bean
- Java Servlets 注入spring bean
- mybatis加Spring项目: 解决There is no getter for property named '***' in 'class java.lang.String'问题
- 【Spring In Action】注入Bean属性
- spring中XML中Bean property 'dataSource' is not writable or has an invalid setter method.
- Spring 配置文件报错:Bean property 'xxx' is not writable or has an invalid setter method
- C#中List保存的结构体
- Spring 基于注解的开发
- java 定时发送邮件以及数据导出excel作为附件
- git flow安装(windows)
- 位图和布隆过滤器
- Spring Bean相互注入 java.lang.StackOverflowError Requested bean is currently in creation: Is there an u
- switch使用小结,大神勿喷
- mongodb DataBase与Collection
- FIFO控制程序
- 线程池(通俗易懂)
- sql语句查询语法
- 串口初始化
- 本地远程连接 liunx mysqlservice
- Qt之显示yuv数据图像