当私有字段与子类中的名称相同时,它们不会在父类中自动连接

Private fields are not Autowired in parent class when they have the same name as in child

提问人:SummertimeSadness 提问时间:10/25/2023 更新时间:10/25/2023 访问量:27

问:

假设我有一些无法修改的库。它的类如下所示:

public class ClassFromLib {

    private Service service;

    public void mainActivity () {
        //some code
        service.doSomething();
        //some code
        secondaryActivity();
    }
    
    public void secondaryActivity() {
        //some code
        service.doSomething();
        //some code
    }

    @Required
    public void setService(Service service) {
        this.service = service;
    }
}

这个类被配置为 bean:

<bean id="classFromLibBean" class="ClassFromLib">
    <property name="service" ref="serviceImpl"/>
</bean>

我需要在我的项目中重写这个类的方法。而且我还需要使用父类中的私有内容。所以,我创建了类似的东西:secondaryActivityservice

public class MyClass extends ClassFromLib {

    private Service service;

    @Override
    public void secondaryActivity() {
        //some custom logic
        service.doSomething();
        //some custom logic
    }

    @Required
    public void setService(Service service) {
        this.service = service;
    }
}

并添加了 bean 配置:

<bean id="myClassBean" class="MyClass">
    <property name="service" ref="serviceImpl"/>
</bean>

但是当我从应用程序上下文中获取自定义 Bean 并调用它时,会返回,因为 field 尚未在父类中初始化,并且它实际上是 null。如果我理解正确,我有这个问题,因为在 bean 初始化期间,它调用子 setter 但忽略了父 setter。我在子类中发现了 WA: rename field 和 setter,但这看起来很丑陋。有没有更好的解决方案?mainActivityNullPointerExceptionservice

Java Spring 自动连线

评论

1赞 Емилиян Йорданов 10/25/2023
重写该方法,因为它具有相同的名称和相同的参数,因此它应该跳过父类 setter 执行。您可以在子类中调用 super overrides 方法。@Required public void setService(Service service) { super.setService(service); this.service = service;
0赞 SummertimeSadness 10/25/2023
@ЕмилиянЙорданов,谢谢,这种方法有效

答:

0赞 SummertimeSadness 10/25/2023 #1

回答 ЕмилиянЙорданов 帮助了我:

重写该方法,因为它具有相同的名称和相同的 参数,因此应跳过父类 setter 执行。您可以在子类覆盖中调用 super 方法。@Required public void setService(Service service) { super.setService(服务);this.service = 服务;}