Spring @Autowired连锁店和常规的新XYZ()'实例

时间:2014-11-19 12:20:08

标签: java spring dependency-injection autowired

我的印象是否正确,通过使用常规new XYZ()方式实例化某个组件,XYZ会阻止Spring处理XYZ中的@Autowired字段?

第二个问题:我不能在XYZ中使用依赖注入,同时在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很好。我想我必须重新考虑一下。有哪些替代方案?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

  1. 如果使用new创建对象,则@Autowired将无效,因为此对象是在Spring IoC container之外创建的。所以这个对象应该由spring实例化,以便让它注入依赖关系。要从容器(spring应用程序上下文)获取此对象(bean),您应该initialize Spring context并调用context.getBean("beanName")
  2. 您可以在此处使用构造函数依赖注入。 Here您可以阅读有关注射类型的更多信息