springboot 启动项目时加载内容、运行初始化方法之 @PostConstruct 及实现ApplicationRunner
大家好啊,我是杨洋,最近不是在写多线程的内容么,肯定线程池是要统一管理啊,我肯定是希望在程序启动的时候就自动创建好线程池啊,就先水一篇怎么在项目启动的时候执行方法
使用@PostConstruct
首先咱们先认识下这个注解
从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法知性之后执行。
另外提一嘴的是@PostConstruct注解的方法将会在依赖注入完成后被自动调用,所以顺序是:Constructor >> @Autowired >> @PostConstruct
如何在实际项目中使用:
代码如下,这个线程池管理类不是最终的类,只是用来展示@PostConstruct
将要执行的方法所在的类交给spring容器扫描(@Component),并且在要执行的方法上添加@PostConstruct注解或者静态代码块执行
/**
*
* 写一个线程池管理
*
* @author yanglei
* @date 2020/8/21
*
*/
@Component
public class ThreadManagerUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(ThreadManagerUtils.class);
//线程池
public static ThreadPoolExecutor fixedThreadPool = null;
//最大能接受的线程数
private static int maxThreadHoldSize = 0;
//初始化
@PostConstruct
public static void init() {
initFixedThreadPool();
System.out.println("开始了init——————————————————————");
}
//开始给线程池赋值
private static void initFixedThreadPool() {
//首先获取最大线程数,如果这边没使用到redis,就直接赋值ThreadConstants.CORE_THREAD_SIZE
int maximumPoolSize = ThreadConstants.CORE_THREAD_SIZE; /*getMaxSize();*/
fixedThreadPool = new ThreadPoolExecutor(ThreadConstants.CORE_THREAD_SIZE, maximumPoolSize, 2,
TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(ThreadConstants.MAX_QUEUE_SIZE));
maxThreadHoldSize = maximumPoolSize + ThreadConstants.MAX_QUEUE_SIZE;
}
}
效果展示:
实现ApplicationRunner
代码示例
/**
* @author yanglei
* @desc 服务启动时需要加载的一些内容示例,例如字典类
* @date 2020/9/2
*/
@Component
@Order(1)//第1个执行,此为加载顺序,当有多个的时候,则可以设置优先级
public class SpringInit implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("<<<<<<<<<<<<<加载SpringInit");
ThreadManagerUtils.init();
System.out.println(">>>>>>>加载结束");
}
}
启动结果:
该接口执行时机为容器启动完成的时候
有个@Order注解,如果有多个实现类,而你需要他们按一定顺序执行的话,可以在实现类上加上@Order注解。@Order(value=整数值)。SpringBoot会按照@Order中的value值从小到大依次执行。
总结:
- 都可以实现我们的需求
- 简单使用直接上注解
- 多个启动要执行的方法资源的时候,用实现ApplicationRunner的方式,并且用order注解排序
- 注意的是order的整数越小越先执行
好啦,今天 的分享就到这了,溜了溜了~