Config 是通過 PropertySource 提供. 這節的內容主要是探討配置, 特別是 PropertySource 的載入機制.
Spring Cloud 技術體系
- 分散式配置
- 服務註冊/發現
- 路由
- 服務呼叫
- 負載均衡
- 短路保護
- 分散式訊息
Spring 事件機制
設計模式
- 觀察者模式(釋出/訂閱)
API: java.util.Observable
, java.util.Observer
釋出者通過 observable.notifyObservers()
通知, 訂閱者是被動感知的. 這種模式是推模式. 而迭代器Iterator 是拉模式, 通過迴圈主動獲取.
- 事件/監聽器模式
API: 類 java.util.EventObject
, 介面 java.util.EventListener
, 此介面是一個標識介面, 無方法.
Spring 事件/監聽
ApplicationEvent
: 事件. 擴充套件了 EventObject
.
ApplicationListener
: 事件監聽器, 擴充套件了 EventListener
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
// 註冊監聽器
context.addApplicationLinstener(new ApplicationListener<MyApplicationEvent>(){
@Override
public void onApplicationEvent(MyApplicationEvent event){
System.out.println("接收到事件: " + event.getSource());
}
});
context.refresh();
// 釋出事件
context.publishEvent(new MyApplicationEvent("test event"));
- 應用場景
MyApplicationEvent
可以通過構造器等注入 context
物件, 從而能拿到工廠中的任意 bean 物件.
Spring Boot 的核心事件
ApplicationEnvironmentPreparedEvent
ApplicationPreparedEvent
ApplicationStartingEvent
ApplicationReadyEvent
ApplicationFailedEvent
Spring Boot 事件/監聽器
ConfigFileApplicationListener
管理配置檔案, 如application-{profile}.properties
或 yaml 格式的檔案. 通過下面入口函式找, 可以發現載入配置檔案的Loader.load()
方法
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationEnvironmentPreparedEvent) {
onApplicationEnvironmentPreparedEvent(
(ApplicationEnvironmentPreparedEvent) event);
}
if (event instanceof ApplicationPreparedEvent) {
onApplicationPreparedEvent(event);
}
}
在 /META-INF/spring.factories
檔案中配置了需要載入的監聽器, 其中包括了 ConfigFileApplicationListener
ConfigFileApplicationListener
實現了Orderd
介面 , 用來控制順序.
Spring Cloud 事件/監聽器
BootstrapApplicationListener
第一, 負責載入bootstrap.properties
或 yaml 格式的檔案. 第二, 負責載入ApplicationContext
名為bootstrap
(ConfigurableApplicationContext context = builder.run()
).
自定義配置屬性
- 繼承
PropertySourceLocator
- 向自定義類註解新增
@Ordered
,@Configuration
- 新增配置到
spring.factories
檔案, key為org.springwork.cloud.bootstrap.BootstrapConfiguration
Environment
允許出現同名配置, 優先順序高的勝出.
MutablePropertySources
使用了CopyOnWriteArrayList
資料結構
public class MutablePropertySources implements PropertySources {
// 使用了 CopyOnWriteArrayList
private final List<PropertySource<?>> propertySourceList = new CopyOnWriteArrayList<>();
...
}