適合對java反射有一點了解的人java
咱們都知道 spring 在 變量前面加上 @autowired @component 等註解就能夠實例化該變量。它是怎麼作到的呢? 反射加Bean工廠,spring掃描這些註解後經過註解從bean工廠裏面取出已實例化的對象,而後經過反射賦值到該變量上面,達到了實例化含有改註解 的變量。git
今天咱們來演示一下經過 反射加註解怎麼實例化一個變量。github
咱們來模擬 簡單一個 三層架構 MVC 工程。spring
DAL 數據訪問層架構
BLL 業務處理層性能
main 就當控制層測試
而後咱們 實例化一個對象的時候 一般是這樣spa
經過 new 關鍵詞 來實例化對象。設計
運行結果:component
如今咱們須要把 BLL 改形成這樣 也能使咱們的程序整運行:
首先看看 咱們 @DAL 是怎麼定義的:
由於咱們要經過反射實例化一個對象, 因此在這個註解上面加入了一個Class 變量。 後面經過傳入的 Class 獲得 實例化對象。
下一步是 掃描註解獲得 註解有 @DAL 註解的變量
下一步 經過反射 含有 DAL 實例化對象
到此 完成 了 反射實例化對象並賦值到了 含有該變量的註解上面
咱們來測試一下
結果和前面經過 new 是同樣的
咱們再加多一個 adminDAL 看看
運行正常。
這只是個簡單的列子,重要的是設計思想。
接下來咱們能夠 實現 一個相似 spring 的bean 容器。 只要初始化過一個的對象 都放到這個容器裏面,下一次從這個 容器裏面獲取這個對象。
這樣就能夠進一步 節約開銷,提高性能。