一般来说,初始化系统账户有两种方法
-
A. 启用监听器,监听容器的启动
-
B. 采用Spring自带的InitalizingBean
A.使用监听器做初始化系统账户
此处采用Spring自带的监听器进行监听,原因是:ServletContext监听器只能监听WEB容器的启动,无法监听Spring容器的启动
原因很简单:WEB容器的启动早于Spring容器
@Component
public class InitSystemAccountListener implements ApplicationListener<ContextRefreshedEvent>{
//注入所需的Service
@Autowired
private ISystemAccountService systemAccountService;
@Override
public void onApplicationEvent(ContextRefreshedEvent event){
//在这里写入初始化系统账户的方法即可
systemAccountService.initSystemAccount();
}
}
B.InitalizingBean
具体原理:
说明:主要是调用Spring在初始化Bean的方法
这里先说原理:很简单:就是在Spring初始化的时候,执行该方法,而且就一次,对,就这么简单
具体原理如下图:
具体的代码如下:
@Service
public class SystemAccountServiceImpl implements ISystemAccountService,InitializingBean{
@Autowired
private SystemAccountMapper systemAccountMapper;
@Override
public void initSystemAccount(){
//查询系统账户
SystemAccount sc = systemAccountService.getCurrent();
//假如没有查询到系统账户
if(!Optional.ofNullable(sc).isPresent()){
this.initSystemAccount();
}
}
//说明系统的初始化方法
public void initSystemAccount(){
SystemAccount sc = new SystemAccount();
systemAccountMapper.insert(sc);
}
}
如果以上在重启容器之后,成功地插入了一条系统数据,那么就说明命令执行成功了。
附带说明:使用到的知识:Bean的生命周期
那么现在具体说明一下关于Bean的生命周期以及解释一下相关的术语:
其中完成系统初始化的关键就是:
InitializatingBean接口,具体作用如图,Bean初始化的时候会去检查是否实现了该接口。
其中值得一提的是:BeanNameAware接口(图中标注为BeanAware应该有误)
在Spring中,该接口用于感知Bean对应的BeanId,假如没有实现该接口,那么就无法找到该Bean对应的ID属性
参考文章:
Bean的生命周期:https://www.cnblogs.com/redcool/p/6397398.html
BeanNameAware的作用:https://www.jianshu.com/p/c5c61c31080b
Bean的Processor:https://www.jianshu.com/p/a90a3e617ba6