【bug修复积累】Spring Bean 生命周期:构造函数中 NPE 的根本原因与 @PostConstruct 的正确使用

复制代码
@Autowired
XXXMapper xxxMapper;
@Autowired
XXXMapper xxxMapper;
@Autowired
XXXMapper xxxMapper;
@Autowired
XXXMapper xxxMapper;


private int CYear;
private int Ryear;
private int Ayear;
private int Vyear;

public XXXServiceImpl(){
    this.CYear = xxxMapper.getCurrentYear();
    this.Ryear = xxxMapper.getCurrentYear();
    this.Ayear = xxxMapper.getCurrentYear();
    this.Vyear = xxxMapper.getCurrentYear();
}

当我启动项目时,发现报了空指针,原因是容器启动时要调用构造器创建bean时,结果确试图调用属性的方法,因为此时属性还未赋值,因此报了空指针。修正方案如下:

复制代码
@Autowired 
XXXMapper xxxMapper; 
@Autowired 
XXXMapper xxxMapper; 
@Autowired 
XXXMapper xxxMapper; 
@Autowired 
XXXMapper xxxMapper;

@Autowired
XzqhManager xzqhManager;

private int CYear;
private int Ryear;
private int Ayear;
private int Vyear;

@PostConstruct
public void init() {
    this.CYear = xxxMapper.getCurrentYear();
    this.Ryear = xxxMapper.getCurrentYear();
    this.Ayear = xxxMapper.getCurrentYear();
    this.Vyear = xxxMapper.getCurrentYear();
}

但此方案有个弊端,就是项目初始化后确定了各个year的值,如果数据库发生变动但是项目没有重启,那么就会出现各个year用的是旧的值。