请教关于泛型自动装配的问题,@Autowired失败,s1和s2都是null,报错说循依赖(Circular reference )

来源:4-8 Spring Bean装配之基于Java的容器注解说明——基于泛型的自动装配

倾真鱼

2015-01-11 10:41

老师

你好,我按照你的代码测试StoreConfig类,但是无法Autowired s1和s2,报错信息如下:

我的Spring版本是4.1.4。请帮忙看一下,谢谢。

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.springtest.beanannotation.store.Store com.springtest.beanannotation.store.StoreConfig.s1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stringStoreTest' defined in com.springtest.beanannotation.store.StoreConfig: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.springtest.beanannotation.store.Store]: Circular reference involving containing bean 'storeConfig' - consider declaring the factory method as static for independence from its containing instance. Factory method 'stringStoreTest' threw exception; nested exception is java.lang.NullPointerException


各个类的代码如下:

//Interface Store<T>
package com.springtest.beanannotation.store;
public interface Store<T> {

}

//IntegerStore
package com.springtest.beanannotation.store;
public class IntegerStore implements Store<Integer> {

}

//StringStore 
package com.springtest.beanannotation.store;
public class StringStore implements Store<String> {
	public void init(){
		System.out.println("This is Init.");
	}
	
	public void destroy(){
		System.out.println("This is Destroy.");
	}
}

//StoreConfig 
@Configuration
@ImportResource("classpath:config.xml")
public class StoreConfig {
	
	@Autowired
	private Store<String> s1;
	
	@Autowired
	private Store<Integer> s2;
	
	@Bean
	public StringStore stringStore(){
		return new StringStore();
	}
	
	@Bean
	public IntegerStore integerStore(){
		return new IntegerStore();
	}
	
	@Bean(name="stringStoreTest")
	public Store stringStoreTest(){
		System.out.println("s1:"+s1.getClass().getName());
		System.out.println("s2:"+s2.getClass().getName());
		return new StringStore();
	}
	
}

//TestStore 
public class TestStore extends UnitTestBase {
	public TestStore(){
		super("classpath*:spring-beanannotation.xml");
	}
	
	@Test
	public void testG(){
		StringStore store = super.getBean("stringStoreTest");
	}
}

//配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd" >
        
        <context:component-scan base-package="com.springtest.beanannotation"></context:component-scan>
        
 </beans>


写回答 关注

4回答

  • moocer
    2015-01-12 10:55:59

    代码没问题,可能是spring版本不同,你试试看用spring4.0.5,所有例子在这个版本下是都能正常运行的。

    倾真鱼

    换了spring4.0.5试了下,不报错,正常输出了。 只是不明白为什么我用最新版本的Spring却不支持这种@Autowired。

    2015-01-13 21:42:52

    共 1 条回复 >

  • 心如止水_imooc
    2016-09-10 12:04:20

    //自动注入失败,加上@Qualifier("name")就行啦

    @Autowired
    @Qualifier("stringStore")
    private Store<String> s1;

    @Autowired
    @Qualifier("integerStore")
    private Store<Integer> s2;

    未卜先知

    4.3.4 成功,比百度还靠谱。。。

    2017-01-08 11:04:38

    共 3 条回复 >

  • qq_DragonHeart_0
    2016-03-03 10:37:02

    @Autowired

    @Qualifier("stringStore")

    private Store<String> s1;// 基于泛型的自动装配 stringStore


    @Autowired

    @Qualifier("integerStore")

    private Store<Integer> s2;// 基于泛型的自动装配 integerStore


    凯哥Java

    @Autowired @Qualifier("integerStore") private Store<Integer> s2;// 基于泛型的自动装配 integerStore 你使用这个在bean和调用是用s2还是integerStore? 你的代码还有吗?可以贴出来看下吗? 谢谢

    2016-05-06 10:16:08

    共 1 条回复 >

  • sunyx
    2015-09-24 16:34:28

    新版本加入@Qualifier 做限定就好了

    qq_Dra...

    在这两个声明前头加入对应的@Qualifier 后运行成功,我的spring版本是4.2.5

    2016-03-03 10:35:24

    共 1 条回复 >

Spring入门篇

为您带来IOC和AOP的基本概念及用法,为后续高级课程学习打下基础

268785 学习 · 963 问题

查看课程

相似问题