java - spring 依赖注入是如何工作的?
问题描述
我想知道依赖项何时注入到 spring bean 中。我有以下代码:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class TestClass {
@Autowired
Environment env;
// throws Null Pointer Here.
String prop = env.getProperty("some.property");
public void test() {
// works here
String prop = env.getProperty("some.property");
}
}
当我尝试获取环境变量时,为什么 spring 会抛出 NPE。调用类构造函数时会发生什么?spring 是否仅在构建时在上下文中查找 bean 可用性,而不是在那时和那里注入它?请解释 bean 创建的完整流程。是否仅在构造对象并将其添加到上下文后才注入依赖项?spring 是仅在创建类的实例后才查找依赖项,还是在调用构造函数时查找它们?
解决方案
我建议您自己阅读有关 bean 生命周期的内容。互联网上有很多漂亮的图表,但是.. 让我来帮助你处理这个 NPE。您要做的是在注入完成之前设置属性。Spring首先进行对象的实例化,然后填充字段,然后进行注入。所以...在初始化 env 字段之前,您的代码首先创建字段(并尝试使用 env 字段设置它们)。方法 test() 在类对象完全创建后调用,因此 env 字段已经正确准备好使用。
我希望这会有所帮助。
推荐阅读
- workbox - 如何更改 WorkboxPlugin 的预缓存路径?(使用 Jigsaw Php 框架)
- python - 如何针对非常大的 N 值优化代码。(时间限制:每个输入文件 1.0 秒,内存限制:256 MB)
- xslt - XML 值包含 xml 字符
- .htaccess - .htaccess 301 使用站点 A 的推荐人重定向到站点 B
- nlp - 我应该使用来自训练、验证和测试语料库的数据来训练嵌入吗?
- python - 最后一个有效项目的子集 df
- sql-server-2008-r2 - 如何在查询中进行逻辑排除?
- javascript - 仅检测父元素的 onMouseOut
- hbase - HBase 安装后的引导操作
- react-native - Invariant Violation:元素类型无效 React-Native