今天有个同事在写代码的时候碰到一个比较冷门的问题,他在一个抽象类当中注入了几个配置属性,同时在抽象方法中去使用,但是拿到的值是null。
如以下代码;
@Slf4j
@Component
public abstract class WxxSupport {
@Value("${sendMsgUrl}")
private String sendMsgUrl;
/**
* 初始化的方法,需要初始化当前用户的
*/
abstract protected Integer getAppId();
abstract protected String getAccessToken();
void print(){
log.info(sendMsgUrl);
}
后来想起来spring注入对象是需要实例来承载的,而抽象类在spring初始化阶段就失败了
,如果spring无法实例化抽象类,那就更不会为当前了注入对象了。
解决方案很简单,就是新建一个子类继承当前的抽象类,根据ava多态向上,向下转型的结果,spring是在实例化子类的同时会也给注入父类所创建的并需要注入实例的属性和对象。
如以下代码
@Component
@Slf4j
public class WxSupportImpl extends WxSupport {
.........................
.........................
void print(){
super.print();
}
}