注入不适用于新操作员
任何人都可以解释为什么@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。
有关更多详细信息,请参阅此问题和答案(在开头链接)。