1. 程式人生 > >Spring Developer Tools 源碼分析:二、類路徑監控

Spring Developer Tools 源碼分析:二、類路徑監控

ring hfile 其中 fadd folder 添加 star adbd 監控目錄

在 Spring Developer Tools 源碼分析一中介紹了 devtools 提供的文件監控實現,在第二部分中,我們將會使用第一部分提供的目錄監控功能,實現對開發環境中 classpath 的監控。

二、類路徑監控

首先看一些這一部分可能涉及到的類圖:

技術分享圖片

在圖中,紅色斜線左上部分是第一部分中介紹的文件目錄監控的類,其中 FileSystemWatcher 會通過獨立線程監控指定的目錄,當目錄內容發生變化時,通過對比快照可以獲得所有監控目錄變化的文件ChangedFiles,然後將變化通知給實現了 FileChangeListener 監聽的訂閱者。
下面按照局部到整體的順序介紹主要的類。

2.1 ClassPathFolders 類目錄

這個類實現了 Iterable<File> 接口,構造方法的參數為 URL[],也就是類路徑的 URL 形式。ClassPathFolders 就是簡單的把 URL 轉換為了 List<File> 集合,最後通過 iterator 返回叠代器。

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 在何處監聽的,當發生變化後,後續要怎樣繼續執行。


未完待續…

Spring Developer Tools 源碼分析:二、類路徑監控