这是the Spring documentation一个例子,部分6.12.5:为什么@Configuration类中的@Autowired字段为空?
@Configuration
public class ServiceConfig {
@Autowired
private AccountRepository accountRepository;
@Bean
public TransferService transferService() {
return new TransferServiceImpl(accountRepository);
}
}
我的问题是:为什么一定要它发生它使用new TransferServiceImpl()
之前accountRepository
创建? Offhand,我没有看到Spring如何知道第二个依赖于第一个设置(除非它通过transferService()
字节码)。是否这是因为Spring的某些操作确保@Autowired
变量在可能调用@Bean
方法之前得到处理?处理顺序是什么?什么样的情况可能导致Spring处理这些乱序?
我问的原因是我有一个这样的事情不起作用,即new
正在执行一个null
参数。要么@Autowired
变量设置得太晚,要么根本没有设置(我的猜测是后者,基于某些log4j.logger.org.springframework.beans
调试输出,但我不确定)。情况当然要复杂得多 - 这是一个很大的应用程序,在配置类中还有几个@Autowired
和@Bean
定义。使用@DependsOn
没有帮助。通过删除代码来缩小问题的范围需要很长时间,直到我可以得到一个简单的例子,但是我想通过了解有关Spring如何处理事情的更多细节,在开始之前了解是否可以深入了解问题艰难的代码缩减路径。
在这种情况下,它不能。相反,在您的'transferService' bean方法中注入'AccountRepository'作为参数。 –
这就是我最终做的解决方法。你是说Spring文档中的例子被破坏了吗? – ajb
@ajb请完整阅读6.12.5。您拥有的代码仅是示例代码。它提到了这种模糊性。 –