Config 是經過 PropertySource 提供. 這節的內容主要是探討配置, 特別是 PropertySource 的加載機制.java
API: java.util.Observable
, java.util.Observer
spring
發佈者經過 observable.notifyObservers()
通知, 訂閱者是被動感知的. 這種模式是推模式. 而迭代器Iterator 是拉模式, 經過循環主動獲取.bootstrap
API: 類 java.util.EventObject
, 接口 java.util.EventListener
, 此接口是一個標識接口, 無方法.設計模式
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 對象.app
ApplicationEnvironmentPreparedEvent
ApplicationPreparedEvent
ApplicationStartingEvent
ApplicationReadyEvent
ApplicationFailedEvent
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
接口 , 用來控制順序.BootstrapApplicationListener
第一, 負責加載 bootstrap.properties
或 yaml 格式的文件. 第二, 負責加載 ApplicationContext
名爲 bootstrap
( ConfigurableApplicationContext context = builder.run()
).PropertySourceLocator
@Ordered
, @Configuration
spring.factories
文件, key爲 org.springwork.cloud.bootstrap.BootstrapConfiguration
Environment
容許出現同名配置, 優先級高的勝出.分佈式
MutablePropertySources
使用了CopyOnWriteArrayList
數據結構ide
public class MutablePropertySources implements PropertySources { // 使用了 CopyOnWriteArrayList private final List<PropertySource<?>> propertySourceList = new CopyOnWriteArrayList<>(); ... }