一、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(); } }