在业务中有些特定的需求在初始化的时候就需完成,即启动就执行某些固定的操作,例如数据库的建表,相关配置的更改,相关数据的指定获取等......,这类业务的场景还蛮多的,近期项目中业务就遇到了哈,简单总结一下各种实现方式,方便碰到相关的需求直接用啦!
(1)静态代码块(java基础):
静态代码块只要加载该类字节码文件必然会执行代码块中的逻辑,最最优先执行
(2)构造方法(java基础):
类加载实例化便会执行构造方法中逻辑
(3) 实现ApplicationContextAware接口(Spring):
实现ApplicationContextAware接口,重写setApplicationContext()方法,在Spring容器初始化的时候便会调用该方法,可以利用这个进行相关代码的初始化,这个类可以获取Spring容器中的所有对象和信息
(4) @PostConstruct注解标注方法(javaee):
使用javaee提供的这个注解,在Servlet加载初始化的时候会执行,
(5) 实现InitializingBean接口:
实现InitializingBean接口,重写afterPropertiesSet()方法,见名知意,就是在bean加载后执行,同下
(6) @Bean注解标注方法,填充初始化参数:
@Bean注解标注方法,填充初始化参数@Bean(initMethod = ""),将当前方法作为初始化方法,同上
(7) 实现ApplicationRunner接口:
实现ApplicationRunner接口重写run(ApplicationArguments args) 方法, Spring的容器初始化完成后会执行该方法,同下
(8) 实现CommandLineRunner接口:
实现CommandLineRunner接口重写 run(String... args) 方法,Spring的容器初始化完成后会执行该方法,同上
(9) SpringBoot的启动类方法中:
SpringBoot的启动类可以执行相关初始化操作(尝试即可)
(10)监控ApplicationEvent事件:
监控ApplicationEvent事件,在Spring容器启动后必然会触发该事件,但是该事件会被多次触发,某些只需要执行一次的操作,使用这个并不可取(看需求啦)
简单总结: 针对于整个服务只需要执行一次的某些操作,推荐使用7,8,9,针对于单个bean的,其余几点修修改改都可以啦
各种实现(9莫有写啦):
@Service
@Slf4j
public class InitServiceDemo implements
InitializingBean,
ApplicationContextAware,
ApplicationRunner,
CommandLineRunner {
/**
* 最最先执行,字节码加载立刻执行,最最优先
*/
static {
log.info("静态代码块初始化");
}
/**
* 构造方法,只要加载bean后实例化时候立刻执行
*/
public InitServiceDemo() {
log.info("构造方法初始化");
}
@PostConstruct
public void postConstruct() {
log.info("postConstruct初始化");
}
/**
* bean注入ioc容器时候会自动执行,同下
*/
@Bean(initMethod = "")
public void init() {
log.info("bean init初始化");
}
/**
* 当前bean进行初始化的时候会自动执行,同上
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
log.info("InitializingBean初始化");
}
/**
* 启动即执行
* @param args
* @throws Exception
*/
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("ApplicationRunner初始化");
}
/**
* 启动即执行
* @param args
* @throws Exception
*/
@Override
public void run(String... args) throws Exception {
log.info("CommandLineRunner初始化");
}
/**
* Spring容器初始化的时候会自动填充上下文对象,这个方法会被调用,
* 可以利用触发指定的方法执行相关的逻辑
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
log.info("ApplicationContextAware 初始化");
}
/**
* 通过监听ApplicationEvent事件触发某个操作,这个方式虽然也能触发相关的操作,
* 但是每次都会执行,对于某个只需要执行一次的操作并不可取,
*
* @param event 只要启动本事件一定会触发
*/
@EventListener
public void listeningInit(ApplicationEvent event) {
log.info("监听ApplicationEvent 进行相关的初始化");
}
}
优先顺序(仅供参考):
有莫有人喜欢熊出没滴,想去狗熊岭旅游,组个队啦