Play框架的啓動有兩種方式:
1、 原生啓動方式:使用自己的Server直接啓動
2、 包裝啓動方式:通過ServletWrapper在Servlet容器中。
值得說明的是,Play框架採用了Mina來實現嵌入的HTTP服務(更準確的講,是異步地HTTP請求IO處理),相當於完全拋棄了Servlet,只這一點,我就爲Play框架的魄力所折服,不知道目前有多少應用是直接用它來作爲生產模式的。
不管用哪種方式,都是通過調用核心類Play.init()方法,來先初始化整個Play框架的。
Play.init()方法有兩個參數,一個是File類型,用於指定應用程序根目錄的;另一個是String類型,用於指定Play框架的id。
Play.init()裏,主要乾了三件事:
1、 初始框架配置:
a) 初始化靜態資源:InitStaticStuff()
b) 讀取版本信息
c) 初始化日誌系統
d) 初始化目錄位置,包括應用程序根目錄、Play框架目錄、臨時文件目錄等
e) 初始化運行模式,分dev開發模式和prod產品模式
2、 加載應用資源:
a) 加載應用Java源文件
b) 加載應用模板文件
c) 加載請求路由配置
d) 加載聲明的外部模塊,主要包括模塊的Java源文件、模板文件和路由配置
e) 創建應用類加載器(ApplicationClassloader)
f) 加載聲明的內置插件
3、 預編譯代碼和模板:
a) 最後如果是產品環境或指定“precomiler”環境變量,則對應用的Java源文件和頁面模板進行預編譯
在加載應用資源時,Play框架沒有直接使用JavaIO裏的File,而定義了一個宣稱模擬VFS的虛擬文件類(VirtualFile),這在後面介紹動態編譯和加載類時,將會介紹到。
另外,在調用Play.init()之前,Play框架其實還通過靜態代碼塊,先初始化了一個重要組件,線程池對象:play.Invoker.executor。這個線程池的作用,後續文章也將進行詳細說明。
liuu.iteye.com