在項目中襟己,SpringBoot啟動后,需要初始化一些業(yè)務牍陌,要在服務啟動后自動執(zhí)行擎浴,不用人去手動操作,即把一些業(yè)務放到某方法中毒涧,服務啟動后可自動執(zhí)行贮预。總結了3種方法:
1. 實現(xiàn)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) // 指定其執(zhí)行順序,值越小優(yōu)先級越高
@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. 實現(xiàn)CommandLineRunner接口
用起來和第一種差不多
@Component
@Order(value = 10) //指定其執(zhí)行順序,值越小優(yōu)先級越高
@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該注解被用來修飾一個非靜態(tài)的void()方法银伟。被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行你虹,并且只會被服務器執(zhí)行一次。PostConstruct在構造函數(shù)之后執(zhí)行枣申,init()方法之前執(zhí)行售葡。
通常我們會是在Spring框架中使用到@PostConstruct注解 該注解的方法在整個Bean初始化中的執(zhí)行順序:
Constructor(構造方法) -> @Autowired(依賴注入) -> @PostConstruct(注釋的方法)
使用時直接方法上面注解看杭,但是會影響服務提供忠藤,比如這個方法要執(zhí)行五分鐘 這五分鐘之內是無法提供服務的,這個方法是在服務初始化后之前運行楼雹, 所以 此方法運行不結束模孩,服務就無法初始化, 在這過程路也無法提供服務贮缅。在業(yè)務中體驗不如上面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());
}
}
}