注入不适用于新操作员

任何人都可以解释为什么@Inject对象在使用new运算符初始化类时为null?

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

当上面的类被创建为A a = new A(); 我把b作为null 。 有人可以解释为什么吗 我知道它在Inject A类时有效。但我想知道为什么它不适用于new运算符。 spring做什么?

dependency injection由弹簧容器处理,因此只有容器创建的对象才会受到它的影响

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

一种可能的解决方案是使用@Configurable Annotation(和AspectJ)来解决这个问题,如文档中所示

还看看这个答案

Spring没有机会在bean中自动生成依赖关系。 dependency injection应该由Spring容器处理。 如果您使用new来创建对象,那么您根本就不使用Spring容器。 您应该为容器请求对象,而不是自己创建实例。 这样,Container将在该对象的生命周期中具有钩子。

 A a = new A(); 

这样, a引用的对象不受Spring管理。 因此,它将无法将任何依赖对象注入到。

你应该从容器中获取A的实例,有点像这样:

 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); A a = context.getBean("myBean"); 

PS: –虽然脱离了上下文 ,但是这个博客对于新的或者不是新的是一个很好的阅读。

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

B将注入spring创造的豆子中。

 A a = new A(); 

这不是spring创造的,这不是spring的豆子。

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

即使看起来如此,注射并不是那么神奇。 如果使用“new”创建实例,则所有发生的事情都是调用构造函数并处理构造函数中的代码。

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

在spring静态访问实体经理和不寻常的架构 (有人可以将此链接移动到最后一段。用我的手机,它是不可能在正确的位置通过它)

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

但这需要真正的AspectJ。

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