SpringBoot启动后执行某个方法

在项目中,SpringBoot启动后,需要初始化一些业务,要在服务启动后自动执行,不用人去手动操作,即把一些业务放到某方法中,服务启动后可自动执行。总结了3种方法:

1. 实现ApplicationRunner接口

import javax.annotation.Resource;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import cn.hutool.system.SystemUtil;
import lombok.extern.slf4j.Slf4j;

@Component
@Order(value = 10) // 指定其执行顺序,值越小优先级越高
@Slf4j
public class SwaggerTips implements ApplicationRunner {
    
    @Resource
    private Environment env;

    /**
     * 项目启动后,若开启了swagger,输出swagger地址
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
        Boolean b = env.getProperty("swagger.enable", Boolean.class);
        int port = env.getProperty("server.port", Integer.class) == null?8080:env.getProperty("server.port", Integer.class);
        String path = env.getProperty("server.servlet.context-path");
        if (b) {
            String address = SystemUtil.getHostInfo().getAddress();
            log.info("\rswagger已开启,访问地址:{}", "http://" + address + ":" + port + path + "/swagger-ui.html");
        }
    }

}

2. 实现CommandLineRunner接口

用起来和第一种差不多

@Component
@Order(value = 10) //指定其执行顺序,值越小优先级越高
@Slf4j
public class MyCommandLineRunner implements CommandLineRunner {
        
    @Resource
    private Environment env;

    /**
     * 项目启动后,若开启了swagger,输出swagger地址
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
        Boolean b = env.getProperty("swagger.enable", Boolean.class);
        int port = env.getProperty("server.port", Integer.class) == null?8080:env.getProperty("server.port", Integer.class);
        String path = env.getProperty("server.servlet.context-path");
        if (b) {
            String address = SystemUtil.getHostInfo().getAddress();
            log.info("\rswagger已开启,访问地址:{}", "http://" + address + ":" + port + path + "/swagger-ui.html");
        }
    }

3. 使用@PostConstruct注解

PostConstruct是Java提供的注解:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
使用时直接方法上面注解,但是会影响服务提供,比如这个方法要执行五分钟 这五分钟之内是无法提供服务的,这个方法是在服务初始化后之前运行, 所以 此方法运行不结束,服务就无法初始化, 在这过程路也无法提供服务。在业务中体验不如上面2种好。
如下:

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import cn.hutool.system.SystemUtil;

@Component
public class PostConstructTest {
    
    @Resource
    private Environment env;
    
    @PostConstruct
    private void swaggerTips() {
        Boolean b = env.getProperty("swagger.enable", Boolean.class);
        if (b) {
            System.out.println(SystemUtil.getHostInfo().getAddress());
        }
    }

}

你可能感兴趣的:(SpringBoot启动后执行某个方法)