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
原创粉丝点击