Java @@Configuration bean中的Autowired bean属性为null
我对@Configuration bean中的@Autowired属性有问题 我有一个类似于下面的bean:Java @@Configuration bean中的Autowired bean属性为null,java,spring,Java,Spring,我对@Configuration bean中的@Autowired属性有问题 我有一个类似于下面的bean: @Configuration public class MyConfig { @Autowired MongoTemplate mongoTemplate; @Bean MongoDbMetadataStore indexMetadataStore() { return new MongoDbMetadataStore(mongoTemplate
@Configuration
public class MyConfig {
@Autowired MongoTemplate mongoTemplate;
@Bean
MongoDbMetadataStore indexMetadataStore() {
return new MongoDbMetadataStore(mongoTemplate, "index");
}
}
而且。。。mongoTemplate在创建IndexMetadatastorebean时为null(通过调试器检查)。不幸的是,我不能提供整个项目结构,它很大(它有~5个XML配置文件和大约20-30个@Configuration bean),我打赌可能会有一个循环引用或类似的东西
但是,这个MongoTemplatebean是在前面创建的,并被注入到其他bean中(也通过调试器进行了检查),因此此时mongoTemplate已完全创建,我无法理解为什么它没有被注入并保留为null
你知道我应该去哪里吗?好的,我发现了一个问题。我将在这里描述它,以便其他人可能会发现这个答案很有用,并节省解决它的宝贵时间:) 事实证明,有一个循环引用,Spring正在尽最大努力初始化和使用未完全初始化的配置对象。有
config1
和config2
bean(都是@Configuration
)使用彼此的对象
有趣的是,在这种情况下,Spring尝试按以下顺序初始化@Resource
、@Autowired
和@Value
:
@Resource
,初始化顺序与@Configuration
bean中声明对象的顺序相同@Value
被视为@Autowired
。因此,在初始化所有@Resource
bean之后,@Value
和@Autowired
按出现顺序初始化@Value
设置,并且在创建从其他配置bean引用的资源时,此类设置可能仍然是null
然而,最好的策略是避免循环引用,最后我就是这么做的——将有问题的资源放到新的第三个配置bean中。order语句似乎是正确的。我的@Configuration bean中有许多@Autowired属性。当试图在my@Bean中使用列表末尾的内容时,它们显示为null
@Configuration
public class MyConfig {
@Autowired
private MyClass myClass;
@Autowired
private MyClass2 myClass2;
...
@Autowired
private MyArgument1 myArgument1;
@Autowired
private MyArgument2 myArgument2;
@Bean(name = "myList")
public List<MyInterface> getMyList() { //given MyArgument1 & MyArgument2 implement MyInterface
List<MyInterface> myList= new ArraList<MyInterface>();
myList.add(myArgument1); //resolved as null
myList.add(myArgument2); //resolved as null
return myList;
}
@配置
公共类MyConfig{
@自动连线
私人MyClass MyClass;
@自动连线
私人密级2密级2;
...
@自动连线
私人MyArgument1 MyArgument1;
@自动连线
私人MyArgument2 MyArgument2;
@Bean(name=“myList”)
公共列表getMyList(){//给定MyArgument1和MyArgument2实现MyInterface
List myList=new ArraList();
myList.add(myArgument1);//解析为null
myList.add(myArgument2);//解析为null
返回myList;
}
}
如果我把它们放在列表的顶部,它们就会得到正确的解决。所以我应该指望有多少人得到妥善解决?我们需要更好的方法
这是有效的
@Configuration
public class MyConfig {
@Autowired
private MyClass myClass;
@Autowired
private MyClass2 myClass2;
...
@Bean(name = "myList")
public List<myInterface> getMyList((@Qualifier("myArgument1") MyInterface myArgument1, (@Qualifier("myArgument2") MyInterface myArgument2) { //given myArgument1 & myArgument 2 are properly labeled as @Component("myArgument1") & @Component("myArgument2")
List<myInterface> myList= new ArraList<myInterface>();
myList.add(myArgument1); //resolved!
myList.add(myArgument2); //resolved!
return myList;
}
@配置
公共类MyConfig{
@自动连线
私人MyClass MyClass;
@自动连线
私人密级2密级2;
...
@Bean(name=“myList”)
公共列表getMyList((@Qualifier(“myArgument1”)MyInterface myArgument1,(@Qualifier(“myArgument2”)MyInterface myArgument2){//给定myArgument1和myArgument2正确标记为@Component(“myArgument1”)和@Component(“myArgument2”)
List myList=new ArraList();
myList.add(myArgument1);//已解决!
myList.add(myArgument2);//已解决!
返回myList;
}
}
这似乎实现了组件扫描中包含的MyConfig类的正确依赖项包?您可能需要使用
@AnnotationDrivenConfig
注释。没有看到完整的示例,这只是猜测。注释@AnnotationDrivenConfig
似乎已在Spring 4中删除。