5

谁能解释为什么@Inject当它的类用运算符初始化时对象为空new

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

A a = new A();我得到上面的类创建bnull. 谁能解释为什么?我知道它在我注入 A 类时有效。但我想知道为什么它不适用于 new 运算符。春天有什么作用?

4

6 回答 6

8

依赖注入由spring容器处理,因此只有容器创建的对象才会受到它的影响

在这种情况下,您正在使用运算符手动创建对象new,spring 容器将不知道对象的创建。

一个可能的解决方案是使用@Configurable注释(和 AspectJ)来解决这个问题,如文档中给出的那样

也看看这个答案

于 2013-06-18T07:22:23.670 回答
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");

PS:-虽然断章取义,但是这个博客to-new-or-not-to-new是一本不错的读物。

于 2013-06-18T07:22:51.667 回答
0

注射器应该如何注意并采取行动new?是无法拦截的语言操作。

于 2013-06-18T07:21:35.587 回答
0

B 将被注入到 spring 创建的 Bean 中。

A a = new A();

这不是由spring创建的,这不是spring bean。

在您的 context.xml 中,您需要创建一个 A 类型的 Bean 并使用它。

于 2013-06-18T07:22:34.483 回答
0

尽管看起来是这样,但注射并不是那么神奇。如果您使用“new”创建一个实例,那么所发生的只是调用构造函数并处理构造函数中的代码。

如何获取具有注入值的类的实例取决于您使用的技术。

于 2013-06-18T07:24:31.557 回答
0

在春季和不寻常的架构中静态访问实体管理器 (有人可以将此链接移至最后一段。用我的手机不可能在正确的位置通过它)

将@Configurable 添加到类中。然后 Spring 将向这个类支付注入,即使它是用普通的 new 创建的。

但这需要真正的 AspectJ。

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

于 2013-06-18T09:16:56.570 回答