有人解释为什么@Inject
对象在用new
运算符初始化类时为null?
public class A{
@Inject
B b;
...
...
}
当上述类创建为A a = new A();
时,我b
为null
。有谁能解释为什么?我知道它在Inject A类时有效。但是我想知道为什么它不适用于new运算符。春天做了什么?
答案 0 :(得分:7)
依赖注入由弹簧容器处理,因此只有容器创建的对象才会受到它的影响
在这种情况下,您使用new
运算符手动创建对象,弹出容器将不知道对象的创建。
一种可能的解决方案是使用@Configurable
Annotation(和AspectJ)来解决这个问题,如documentation
另请查看this answer
答案 1 :(得分:4)
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");
P.S:虽然不在上下文中,但此博客to-new-or-not-to-new是一个很好的阅读。
答案 2 :(得分:0)
注射器应如何注意并对new
采取行动?这是一种无法拦截的语言操作。
答案 3 :(得分:0)
B将被注入春天创造的Bean中。
A a = new A();
这不是春天创造的,这不是春天豆。
在context.xml中,您需要创建一个类型为A的Bean并使用它。
答案 4 :(得分:0)
即使看起来如此,注射并不是那么神奇。 如果使用“new”创建实例,则所有发生的事情都是调用构造函数并处理构造函数中的代码。
如何获取具有注入值的类的实例取决于您使用的技术。
答案 5 :(得分:0)
static access to entity manager in spring and unusual architecture (有人可以将此链接移至最后一段。使用我的手机,无法将其放在正确的位置)
将@Configurable添加到课程中。然后Spring会向这个类注入,即使它是用普通的new创建的。
但这需要真正的AspectJ。
有关更多详细信息,请参阅此问题和答案(开头的链接)。