【发布时间】:2013-03-13 17:29:10
【问题描述】:
我很难理解为什么 Spring Java Config 中使用 @Autowired 的东西不起作用。
首先,我试图在 Java Config 类中移动我的所有 @Autowired 注释。这具有使我的“POJO”回到真正的 POJO 的效果。然后,我不仅可以在 Spring 上下文之外轻松测试它们,还可以轻松轻松地使用模拟对象。
所以我首先尝试了这个:
@Configuration
public class Module3ConfigClass {
@Autowired
private Module1Bean1 module1Bean1;
@Autowired
private Module2Bean1 module2Bean1;
@Bean
public Module3Bean1 module3Bean1() {
return new Module3Bean1(module1Bean1, module2Bean1);
}
}
但是,当调用Module3Bean1 构造函数时,传入的 Bean 都为 null。如果您没有遵循我上面编造的命名约定,那么这两个 bean 都将由单独的 Java Config 配置文件创建。另请注意,所有 都已正确连接 - 我知道这一点,因为当 @Autowired 标记位于 Module3Bean1 内的相应私有成员字段上时,一切正常。
FWIW,我尝试在 module3Bean1() 方法中添加 @DependsOn 注释,但结果相同。我想我只是真的很想了解这种行为,它是否正确(我怀疑它是,但为什么)?
最后,我找到了一个可接受的解决方法:
@Configuration
public class Module3ConfigClass {
@Bean
@Autowired
public Module3Bean1 module3Bean1(Module1Bean1 module1Bean1, Module2Bean1 module2Bean1) {
return new Module3Bean1(module1Bean1, module2Bean1);
}
}
这对我来说似乎很好,但如果有人愿意对此发表评论,那也将受到欢迎。
【问题讨论】:
-
在自动装配之前需要创建 Bean。向我们展示这些 bean 在哪里,其他配置。您可能需要
@Import那个@Configuration类。 -
好吧,它们在上述两种情况下都被正确地自动装配了。首先是当自动装配在工厂(配置)过程之外时,第二个是当它们在所示代码中自动装配时。因此,只需假设这些都是琐碎的 bean,每个都在它们自己的 (at)Configuration 注释类中并正确导入。我只是想知道为什么一些(at)Autowired bean 出现在(at)Configuration 类中,而有些(如上所示)没有。
-
那么我只能假设所有的bean都是在它们有资格进行注入/自动装配之前创建的。至于您的解决方法,我认为该方法可能会被调用两次,一次用于
@Bean创建,一次用于@Autowired。检查您的日志。 -
谢谢。您提供的用“@Autowired”注释“@Bean”方法的解决方法也对我有用。我仍然不明白为什么在这种情况下对 java 字段进行自动装配不起作用。
标签: java spring configuration