Spring Autowire

时间:2015-07-22 19:21:04

标签: java spring autowired

我有两个课程 - ParentClsSubCls

class ParentCls {
    public ParentCls(int x, int y); 
    ....
}

class SubCls {
    public SubCls(int x, int y, int z) {
        super(x, y);
        // some init codes ..
        this.z = z;
    } 
    ....
}

现在我通过传递x,y,z参数来创建SubCls的实例,其中两个传递给超类。我试图将Config对象(其中包含x,y,z的值)自动装配到SubCls中,而不是这样做:

class SubCls {
    @Autowired
    IConfig config;

    public SubCls() {
        super(x, y);  // <- the problem: config.getX() doesn't work in super()
        // some init codes ..
        this.z = config.getZ();
    } 
    ....
}

然而,问题是:我无法在config中使用注入的super()对象。有没有办法使这项工作?

2 个答案:

答案 0 :(得分:2)

当您像这样进行自动装配时,Spring首先使用no-arg构造函数创建SubCls的实例,然后才为config设置值。因此,在构造函数中,您将看到config的默认值,即null,并且调用config.getX()将抛出NullPointerException

要解决此问题,请使用自动装配构造函数参数:

class SubCls {
    IConfig config; // if you'll need config in the future

    @Autowired
    public SubCls(IConfig config) {
        super(config.getX(), config.getY());
        this.z = config.getZ();
        this.config = config; // if you'll need config in the future
    }
}

答案 1 :(得分:0)

当你说你“不能在超级中使用注入的配置对象”时,我猜你的意思是你得到一个NullPointerException,这是正常的:那是因为在调用超级构造函数时,Spring没有已经初始化了config引用。

我建议您在单例中转换类Config,并保留以下代码:

class SubCls {
    public SubCls() {
        super(Config.getInstance().getX(), Config.getInstance().getY());
        // some init codes ..
        this.z = config.getZ();
    } 
    ...
}