InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。
@Slf4j
@Service
public class QuartzServiceImpl implements QuartzService, InitializingBean {
private AtomicInteger atomicInteger;
@Autowired
private QuartzTaskInformationsService quartzTaskInformationsService;
@Autowired
private QuartzTaskErrorsService quartzTaskErrorsService;
@Autowired
private QuartzTaskRecordsService quartzTaskRecordsService;
@Autowired
private SchedulerFactoryBean schedulerBean;
/**
* 初始化加载定时任务
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
this.initLoadOnlineTasks();
}
/**
* 初始化加载定时任务
* 初始化加载,就是说,每次重启系统,要把之前建的定时任务加载进quartz的Scheduler调度器,
* 他这里采用的就是@PostConstruct注解,在注入service前就先加载:
* InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,
* 凡是继承该接口的类,在初始化bean的时候都会执行该方法。
* @throws Exception
*/
@Override
public void initLoadOnlineTasks() {
List<QuartzTaskInformations> unnfrozenTasks =quartzTaskInformationsService.
getUnnfrozenTasks (ResultEnum.UNFROZEN.name ());
if (CollectionUtils.isEmpty (unnfrozenTasks)){
log.info ("没有需要初始化加载的定时任务");
return;
}
schedulerBean.getScheduler ();
}
这说明在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。我的的springboot中用到的是@PostConstruct注解在QuartzServiceImpl注入service前就先加载。
总结:
1、Spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中通过init-method指定,两种方式可以同时使用。
2、实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率要高一点,但是init-method方式消除了对spring的依赖。
3、如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。
4、如果某个类实现了ApplicationContextAware接口,会在类初始化完成后,并在setApplicationContext()方法执行完毕后,调用afterPropertiesSet()方法进行操作。