在项目中,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());
}
}
}