1 应用场景:
在业务中有些特定的需求在初始化的时候就需完成,即启动就执行某些固定的操作,例如数据库的建表,相关配置的更改,相关数据的指定获取等......,这类业务的场景还蛮多的,近期项目中业务就遇到了哈,简单总结一下各种实现方式,方便碰到相关的需求直接用啦!
2 具体实现
(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 进行相关的初始化"); } }
优先顺序(仅供参考):
有莫有人喜欢熊出没滴,想去狗熊岭旅游,组个队啦