我的印象是否正确,通过使用常规的 new XYZ()
方式实例化某些组件 XYZ 会阻止 Spring 处理 XYZ 内的 @Autowired
字段?
第二个问题:我不能在 XYZ 中使用依赖注入(inject)并同时在 XYZ 中使用最终字段,这是正确的吗?示例:
@Component
public class XYZ {
@Autowired
private SomeDep dep;
private final int value;
public XYZ(int value) {
this.value = value;
}
}
我该如何使其发挥作用?
所以,好吧,接受没有更好的方法,让我们这样做吧:
@Component
public class XYZ {
@Autowired
private SomeDep dep;
private final int value;
// factory instantiation
XYZ() {
value=0;
}
private XYZ(SomeDep dep, int value) {
this.dep = dep;
this.value = value;
}
public XYZ getInstance(int value) {
return new XYZ(dep, value);
}
}
???那太丑了。当我想将依赖声明移动到父类时,它会变得更加丑陋......???我一直觉得DI不错。我想我必须重新考虑这一点。有哪些替代方案?我错过了什么吗?
最佳答案
- 如果您使用
new
创建对象,@Autowired 将不起作用,因为该对象是在 Spring IoC container 之外创建的。 。所以这个对象应该由spring实例化,以便让它注入(inject)依赖。要从容器(spring 应用程序上下文)获取此对象(bean),您应该 initialize Spring context并调用context.getBean(“beanName”)。 - 您可以在此处使用构造函数依赖注入(inject)。 Here您可以阅读有关注入(inject)类型的更多信息
关于java - Spring @Autowired 链和常规 'new XYZ()' 实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27016693/