在 Spring Developer Tools 源碼分析一中介紹了 devtools 提供的文件監控實現,在第二部分中,我們將會使用第一部分提供的目錄監控功能,實現對開發環境中 classpath 的監控。
二、類路徑監控
首先看一些這一部分可能涉及到的類圖:
在圖中,紅色斜線左上部分是第一部分中介紹的文件目錄監控的類,其中 FileSystemWatcher 會通過獨立線程監控指定的目錄,當目錄內容發生變化時,通過對比快照可以獲得所有監控目錄變化的文件ChangedFiles,然後將變化通知給實現了 FileChangeListener 監聽的訂閱者。
下面按照局部到整體的順序介紹主要的類。
2.1 ClassPathFolders 類目錄
這個類實現了 Iterable
2.2 ClassPathRestartStrategy 重啟策略
接口方法根據變化的文件來決定是否需要重啟。
默認提供了 PatternClassPathRestartStrategy 實現,這個實現支持 Ant 風格的模式匹配,通過設置 excludePatterns 類設置不需要重啟的文件名(從類路徑開始的相對路徑)。不在排除範圍內的文件發生變化時,就會返回 true 來引起後續的重啟。
2.3 ClassPathChangedEvent 類路徑變化事件
該類繼承了 ApplicationEvent,事件中包含變化的文件集合以及系統是否需要重啟的標誌。該類在後面的 ClassPathFileChangeListener 中,會將監控目錄發生變化的消息轉換為 Spring 的事件,轉換後就可以方便的通過 @EventListener 註解進一步解耦事件監聽。
2.4 ClassPathFileChangeListener 類路徑變化監聽器
這個類實現了 FileChangeListener ,並且會在後面的 ClassPathFileSystemWatcher 中添加到 FileSystemWatcher 的訂閱列表中。
當文件變化時,就會觸發下面的方法:
這裡先使用前面提到過的重啟策略判斷此次變化是否需要重啟,然後創建一個 ClassPathChangedEvent事件,通過 Spring 的
ApplicationEventPublisher 發佈出去。發佈事件後,所有監聽 ClassPathChangedEvent 事件的監聽器都會觸發執行,在後續博客中會通過對該事件的監聽和這裡建立聯繫。Java架構交流學習圈:874811168 面向1-3年經驗 Java開發人員 幫助突破瓶頸 提升思維能力2.4 ClassPathFileSystemWatcher 類路徑文件監控
類路徑監控的實現類為 ClassPathFileSystemWatcher,先看這個類的構造方法:
創建該類時,需要提供 FileSystemWatcher 的工廠類,PatternClassPathRestartStrategy 重啟策略類以及要監控的類路徑 URL[]。
在構造方法中,通過工廠類獲取了 fileSystemWatcher,設置了當前的重啟策略,然後通過 ClassPathFolders 包裝了 URL[] 數組。然後設置 fileSystemWatcher 監控這些目錄(fileSystemWatcher 通過 Iterator 接口和 ClassPathFolders 解耦)。
ClassPathFileSystemWatcher 還實現了 InitializingBean 接口和 ApplicationContextAware 接口,其中 setApplicationContext 方法會在 afterPropertiesSet 方法前執行,兩個方法的實現如下:
雖然這裡會判斷 restartStrategy,但是 devtools 默認配置時是提供該策略的,不管你是否配置了排除目錄,都會提供這個策略,只有提供了這個策略,才會有 ClassPathFileChangeListener,後續監聽 ClassPathChangedEvent 事件才能起作用。在所有Bean屬性設置好後(afterPropertiesSet),
this.fileSystemWatcher.start() 就啟動了 。Java架構交流學習圈:874811168 面向1-3年經驗 Java開發人員 幫助突破瓶頸 提升思維能力此時類路徑已經被監控了,後續我們需要知道 ClassPathFileSystemWatcher 是何時創建的,ClassPathChangedEvent 在何處監聽的,當發生變化後,後續要怎樣繼續執行。
未完待續…
閱讀更多 七月Ala 的文章