1、靜態(tài)代碼塊
static靜態(tài)代碼塊,在類加載的時(shí)候即自動(dòng)執(zhí)行。
2、構(gòu)造方法
在對(duì)象初始化時(shí)執(zhí)行。執(zhí)行順序在static靜態(tài)代碼塊之后。
3、通過(guò)注解@PostConstruct實(shí)現(xiàn)
@PostConstruct注解使用在方法上,它可以被用來(lái)標(biāo)注一個(gè)非靜態(tài)的 void 方法,這個(gè)方法會(huì)在該類被 Spring 容器初始化后立即執(zhí)行。因?yàn)樗膱?zhí)行時(shí)機(jī)是在依賴注入之后,對(duì)象構(gòu)造完成之后,也就是說(shuō)是在@Autowired注入之后執(zhí)行。所以這里可以進(jìn)行一些初始化操作,如某些需要在對(duì)象創(chuàng)建后才能進(jìn)行的數(shù)據(jù)初始化操作。
需要注意以下幾點(diǎn):
-
@PostConstruct 只能用在方法上面,而不能用在屬性或構(gòu)造函數(shù)上。
-
一個(gè)類中可以有多個(gè)使用 @PostConstruct 注解的方法,但執(zhí)行順序并不是固定的。
-
@PostConstruct 注解的方法在本類中必須是無(wú)參數(shù)的,如果有參數(shù),那么這個(gè)方法不會(huì)被執(zhí)行。
-
@PostConstruct 注解的方法在實(shí)現(xiàn)上可以使用任意修飾符。
假設(shè)我們有一個(gè)需要初始化數(shù)據(jù)的類:
public class InitService {
private List<String> data;
public InitService() {
this.data = Arrays.asList("A", "B", "C");
}
@PostConstruct
public void init() {
data.add("D");
}
public List<String> getData() {
return this.data;
}
}
當(dāng)我們實(shí)例化 InitService 時(shí),構(gòu)造函數(shù)會(huì)為 data 屬性賦初值,而 @PostConstruct 注解的 init 方法會(huì)在 Spring 容器實(shí)例化完 InitService 后被執(zhí)行,將 “D” 添加到 data 列表中。所以當(dāng)我們調(diào)用 getData() 方法時(shí),返回的列表應(yīng)該是 [A, B, C, D]。
接下來(lái)看看 @Autowired 和@PostConstruct 的具體執(zhí)行順序
@Service
public class TestA {
static {
System.out.println("staticA");
}
@Autowired
private TestB testB;
public TestA() {
System.out.println("這是TestA 的構(gòu)造方法");
}
@PostConstruct
private void init() {
System.out.println("這是TestA的 init 方法");
testB.test();
}
}
@Service
public class TestB {
static {
System.out.println("staticB");
}
@PostConstruct
private void init() {
System.out.println("這是TestB的init 方法");
}
public TestB() {
System.out.println("這是TestB的構(gòu)造方法");
}
void test() {
System.out.println("這是TestB的test方法");
}
}
?服務(wù)啟動(dòng)后,輸出結(jié)果如下:
staticA
這是TestA 的構(gòu)造方法
staticB
這是TestB的構(gòu)造方法
這是TestB的init 方法
這是TestA的 init 方法
這是TestB的test方法
結(jié)論為:等@Autowired注入后,在執(zhí)行@PostConstruct注解的方法。
4、實(shí)現(xiàn)CommandLineRunner和ApplicationRunner接口
當(dāng)有多個(gè)類實(shí)現(xiàn)了?ApplicationRunner?
和?CommandLineRunner?
接口時(shí),可以通過(guò)在類上添加@Order(數(shù)值越大,優(yōu)先級(jí)越低)注解來(lái)設(shè)定運(yùn)行順序。
實(shí)現(xiàn)ApplicationRunner接口
@Component
@Order(1)
public class TestApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("order1:TestApplicationRunner");
}
}
?實(shí)現(xiàn)CommandLineRunner接口
@Component
@Order(2)
public class TestCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... strings) throws Exception {
System.out.println("order2:TestCommandLineRunner");
}
}
結(jié)論
最終的執(zhí)行結(jié)果如下文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-489919.html
staticA
這是TestA 的構(gòu)造方法
staticB
這是TestB的構(gòu)造方法
這是TestB的init 方法
這是TestA的 init 方法
這是TestB的test方法
order1:TestApplicationRunner
order2:TestCommandLineRunner
所以得到結(jié)論:static>constructer>?@Autowired>@PostConstruct>ApplicationRunner>CommandLineRunner文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-489919.html
到了這里,關(guān)于SpringBoot啟動(dòng)時(shí)的幾種初始化操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!