[英]@Autowired bean property is null in @Configuration bean
@Configuration bean 中的 @Autowired 属性有问题。
我有一个类似于下面的豆子:
@Configuration
public class MyConfig {
@Autowired MongoTemplate mongoTemplate;
@Bean
MongoDbMetadataStore indexMetadataStore() {
return new MongoDbMetadataStore(mongoTemplate, "index");
}
}
并且 ... mongoTemplate 在创建 indexMetadataStore bean 时为 null(用调试器检查)。 不幸的是,我无法提供整个项目结构,它很大(它有大约 5 个 XML 配置文件和大约 20-30 个 @Configuration bean),我敢打赌可能会有循环引用或类似的东西。
然而,这个 mongoTemplate bean 是更早创建的并注入到其他 bean(也用调试器检查),所以此时 mongoTemplate 已完全创建,我不明白为什么它没有注入并留空。
我应该在哪里看的任何想法?
好的,我发现了一个问题。 我将在这里描述它,以便其他人可能会发现这个答案有用并节省解决它的宝贵时间:)。
结果证明存在循环引用,Spring 正在尽最大努力初始化和使用未完全初始化的配置对象。 有config1
和config2
bean(都是@Configuration
),它们使用彼此的对象。
有趣的是,在这种情况下,Spring 会尝试按以下顺序初始化@Resource
、 @Autowired
和@Value
:
@Resource
首先初始化,按照对象在@Configuration
bean 中声明的顺序@Value
被视为@Autowired
。 因此, @Value
和@Autowired
在所有@Resource
bean 初始化之后按照出现的顺序进行初始化。 理解上述顺序很重要,因为您的 bean 和循环引用可能依赖于@Value
设置,并且在创建从其他配置 bean 引用的资源时,此类设置可能仍然为null
。
然而,最好的策略是避免循环引用,最后这就是我所做的 - 将违规资源放到新的第三个配置 bean 中。
订单声明似乎是正确的。 我的 @Configuration bean 中有许多 @Autowired 属性。 尝试在我的 @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;
}
}
如果我把它们放在列表的顶部,它们就会得到正确的解决。 那么..我应该指望正确解决多少? 需要更好的方法。
这是工作
@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;
}
}
这似乎实现了正确的依赖
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.