我有两个课程 - ParentCls
和SubCls
:
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()
对象。有没有办法使这项工作?
答案 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();
}
...
}