springboot 启动项目时加载内容、运行初始化方法之@PostConstruct及实现ApplicationRunner

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;
    }
}

效果展示:
springboot 启动项目时加载内容、运行初始化方法之@PostConstruct及实现ApplicationRunner_第1张图片

实现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(">>>>>>>加载结束");

    }
}

启动结果
springboot 启动项目时加载内容、运行初始化方法之@PostConstruct及实现ApplicationRunner_第2张图片
该接口执行时机为容器启动完成的时候
有个@Order注解,如果有多个实现类,而你需要他们按一定顺序执行的话,可以在实现类上加上@Order注解。@Order(value=整数值)。SpringBoot会按照@Order中的value值从小到大依次执行。

总结:

  1. 都可以实现我们的需求
  2. 简单使用直接上注解
  3. 多个启动要执行的方法资源的时候,用实现ApplicationRunner的方式,并且用order注解排序
  4. 注意的是order的整数越小越先执行

好啦,今天 的分享就到这了,溜了溜了~

你可能感兴趣的:(项目搭建,多线程,java,spring,spring,boot)