谁能解释为什么@Inject
当它的类用运算符初始化时对象为空new
?
public class A{
@Inject
B b;
...
...
}
当A a = new A();
我得到上面的类创建b
为null
. 谁能解释为什么?我知道它在我注入 A 类时有效。但我想知道为什么它不适用于 new 运算符。春天有什么作用?
Spring 没有机会在它自己创建的 bean 中自动装配依赖项。依赖注入应该由 Spring 容器处理。如果您使用new
创建对象,那么您根本就没有使用 Spring 容器。与其自己创建实例,不如向容器请求对象。这样,Container 将在该对象的生命周期上挂上钩子。
A a = new A();
这样,您引用的对象a
就不会由 Spring 管理。因此它将无法将任何依赖对象注入a
.
您应该从容器中获取实例A
,有点像这样:
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
A a = context.getBean("myBean");
PS:-虽然断章取义,但是这个博客to-new-or-not-to-new是一本不错的读物。
注射器应该如何注意并采取行动new
?是无法拦截的语言操作。
B 将被注入到 spring 创建的 Bean 中。
A a = new A();
这不是由spring创建的,这不是spring bean。
在您的 context.xml 中,您需要创建一个 A 类型的 Bean 并使用它。
尽管看起来是这样,但注射并不是那么神奇。如果您使用“new”创建一个实例,那么所发生的只是调用构造函数并处理构造函数中的代码。
如何获取具有注入值的类的实例取决于您使用的技术。
在春季和不寻常的架构中静态访问实体管理器 (有人可以将此链接移至最后一段。用我的手机不可能在正确的位置通过它)
将@Configurable 添加到类中。然后 Spring 将向这个类支付注入,即使它是用普通的 new 创建的。
但这需要真正的 AspectJ。
有关更多详细信息,请参阅此问题和答案(开头的链接)。