编写初始化操作类

实现接口ApplicationListener,并重写public void onApplicationEvent(ApplicationEvent event) {}可以在容器初始话的时候执行这个方法。

会存在一个问题,在web 项目中(spring mvc),系统会存在两个容器,一个是root application context ,另一个就是我们自己的 projectName-servlet context(作为root application context的子容器)。就会造成onApplicationEvent方法被执行两次。为了避免上面提到的问题,我们可以只在root application context初始化完成后调用逻辑代码,其他的容器的初始化完成,则不做任何处理,所以加入判断:if (event.getApplicationContext().getParent() == null){...}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.yzeng.init;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

public class ApplicationStartListener implements ApplicationListener<ContextRefreshedEvent>{

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// TODO Auto-generated method stub

// 防止并行执行
if (event.getApplicationContext().getParent() == null)
{
//do something 这里写下将要初始化的内容
System.out.println("do something");
}
}

}

编写配置类来实例化操作类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.yzeng.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.yzeng.init.ApplicationStartListener;


@Configuration
public class InitConfig {
@Bean
public ApplicationStartListener applicationStartListener(){
return new ApplicationStartListener();
}
}

启动SpringBoot项目

在入口类中运行项目,查看启动日志:
日志