注入不适用于新操作员

时间:2013-06-18 07:19:39

标签: java spring

有人解释为什么@Inject对象在用new运算符初始化类时为null?

public class A{
    @Inject
    B b;
    ...
    ...
}

当上述类创建为A a = new A();时,我bnull。有谁能解释为什么?我知道它在Inject A类时有效。但是我想知道为什么它不适用于new运算符。春天做了什么?

6 个答案:

答案 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。

有关更多详细信息,请参阅此问题和答案(开头的链接)。