spring @Autowired字段在新抽象类中使用时为空

kg7wmglp  于 2022-11-21  发布在  Spring
关注(0)|答案(1)|浏览(175)

我有一段代码在运行:

@Component
public class MessageUtil {

    @Autowired
    @Qualifier("processMessages")
    private ReloadableConfig config;
    
    public String createMessage() {
        return config.getPropertyStr("message.simple.signature");
    }
}

Bean processMessages定义如下:

<bean id="processMessages" class="com.company.framework.resources.ReloadableConfig">
    <property name="basename" value="classpath:com/company/aaa/bbb/domain/service/processMessages"/>
    <property name="defaultEncoding" value="UTF-8"/>
    <property name="cacheSeconds" value="60"/>
</bean>

然后我创建了一些新类:

public abstract class MessageBuilder {
    @Autowired
    @Qualifier("processMessages")
    protected ReloadableConfig config;
    
    public abstract String createMessage();
}

@Component
public class SimpleMessageBuilder extends MessageBuilder {
    private String template;

    private void setTemplate() {
        template = config.getPropertyStr("message.simple.signature");
    }

    @Override
    public String createMessage() {
        setTemplate();
        return template;
    }
}

我现在遇到了一个NullPointerException,因为在setTemplate()中,config是空的。第二个代码中有什么问题?

wbgh16ku

wbgh16ku1#

@Autowired既不适用于字段也不适用于抽象类的构造函数。它适用于抽象类的setter,但一定要使其成为final,因为如果被具体类覆盖,行为将不稳定。抽象类不会被组件扫描,因为没有具体子类就无法示例化。

相关问题