SpringBoot比較重要的回調機制,事件,synchronized鎖


一、SpringBoot比較重要的回調機制

演示項目:D:\javasrc\springboot學習筆記\sb-callback
參考課程:全方位深入解析最新版SpringBoot源碼 D:\javastudy\全方位深入解析最新版SpringBoot源碼\sb2
 
應用場景:
1.啟動前環境檢測?
2.啟動時配置初始化?
3.啟動后數據初始化?
 
類型
注入方式
回調時機
總體回調順序
應用場景
ApplicationContextInitializer
spring.factories
等3種
IOC容器初始化時被回調
1
啟動前環境檢測
SpringApplicationRunListener
spring.factories
springboot啟動過程中被多次回調
貫穿整個過程,最開始到最后
非常靈活,比如啟動時配置初始化
ApplicationRunner
IOC容器,及類加注解@Component
容器啟動完成后被回調
2
啟動后數據初始化
CommandLineRunner
IOC容器,及類加注解@Component
ApplicationRunner后被回調
3
啟動后數據初始化
ApplicationReadyEvent
IOC容器,及類加注解@Component
implements ApplicationListener<ApplicationReadyEvent>
在CommandLineRunner后
SpringApplicationRunListener...running前
4
啟動后數據初始化
 
回調順序:
SpringApplicationRunListener...starting...
SpringApplicationRunListener...environmentPrepared..Windows 10
ApplicationContextInitializer:...run....
SpringApplicationRunListener...contextPrepared...
SpringApplicationRunListener...contextLoaded...
SpringApplicationRunListener...started...
ApplicationRunner1...run....
ApplicationRunner2...run....
CommandLineRunner...run...[]
onApplicationEvent-ApplicationReadyEvent...run....
SpringApplicationRunListener...running...
 
 

二、自定義事件發布和監聽

演示項目:D:\javasrc\springboot學習筆記\sb-event
 
  • 2種監聽方法
1)實現接口
spring.factories 和 implements ApplicationListener<E extends ApplicationEvent>
2)基於注解
@Component 和 @EventListener
 
  • 異步監聽
類注解:@EnableAsync
方法注解:@Async
 
3.項目改造建議
1)利用ApplicationRunner改造
main函數中的所有操作都可以用:ApplicationRunner方式初始化數據
好處:不用每個main函數去寫重復代碼,如有需要,不同環境可以用@ConditionalOnProperty來控制
 
2)利用事件改造
事件可以獨立出來,使得事件不依賴於
不同環境不需要的事件,可以用@ConditionalOnProperty條件來控制
 
SpringBoot:回調,自定義事件發布和監聽
synchronized鎖

三、synchronized鎖

D:\javastudy\並發相關\synchronizedDemo

1.三種鎖

this,ObjectLock.class,自定義對象鎖:Object lock = new Object()
三種鎖不是同一把鎖,任何一把鎖鎖住了,不影響其他鎖的執行
 

2.synchronized (this)和synchronized void 共用同一把鎖

method1和method4
 
public void method1_synchronized_this() {
//對象鎖
synchronized (this) {
try {
System.out.println("do method1..synchronized (this)" + LocalDateTime.now());
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
 
public synchronized void method4_synchronized_void() {
try {
System.out.println("do method4..synchronized void" + LocalDateTime.now());
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

 

 

3.synchronized (ObjectLock.class)和static synchronized void共用同一把鎖

method2和method5
 
public void method2_synchronized_ObjectLock_class() {
//類鎖
synchronized (ObjectLock.class) {
try {
System.out.println("do method2..synchronized (ObjectLock.class)" + LocalDateTime.now());
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
 
public static synchronized void method5_static_synchronized_void() {
//類鎖
try {
System.out.println("do method5..static synchronized void" + LocalDateTime.now());
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM