天天看點

菜鳥簡單模仿一下spring的ioc和aop思想,歡迎大家進來閱讀指教

spring最核心的部分莫過于ioc和aop了,部落客菜逼一枚,如果有哪裡了解的不對或者代碼上有瑕疵的地方歡迎大家指正,大家互相學習,還有就是這隻是模仿一下spring思想,隻是把事務管理和bean管理簡單模仿一下,完全不代表spring,如果想深入了解請看spring源碼,下面就開始我們簡單的模仿,純手打,覺得還行就贊一下吧~

這個項目不是web項目,隻是一個簡單的java項目,測試用junit,廢話不多說了,下面上代碼:

項目的目錄結構:

菜鳥簡單模仿一下spring的ioc和aop思想,歡迎大家進來閱讀指教
菜鳥簡單模仿一下spring的ioc和aop思想,歡迎大家進來閱讀指教

說明:圖中劃紅線的部分都是核心部分

紅線部分說明:

① beanfactory:所有bean的核心生成器(spring容器), ② connbean:jdbc連接配接生成器(沒用連接配接池哦~)

③transaction:事務管理的代理類, ④ beans.properties:配置檔案

其餘的沒劃線的就是domain、dao、service、controller這些web基本層次結構,待會會說

主要幾個類的代碼:

① beanfactory:

上面的類可以通過配置檔案來執行個體化不同的對象,符合ioc最基本的思想,下面讓我們來看看配置檔案beans.properties的内容吧:

這裡面隻有兩句話,指定dao層接口對象的實作類的路徑,其實已經很接近spring的xml裡對bean的配置了,隻不過這裡是properties檔案,簡化了許多

② transactionproxy代理類:

說明:java在1.3版本的時候就為我們提供了一個用作代理類實作的接口invacationhandler,通過實作這個接口可以很随意的寫一個耦合度特别低的動态代理類(即這一個代理類可以代理任何類)

③ connbean,用來生成一個資料庫連接配接對象,在不用連接配接池的情況下,我們用threadlocal進行封裝,代碼如下:

以上就是核心的一些實作代碼,下面讓我們來看一下我們的業務吧:

實體類:user,userdetail,要求添加一個user的同時要添加一個userdetail

user:

userdetail:

dao層的接口和實作:

userdao:

userdaoimpl:

userdetaildao:

userdetaildaoimpl:

userservice:

usercontroller:

測試類:

ok,大功告成了,現在讓我們用junit來測試一下吧:

service層不加

執行結果:

菜鳥簡單模仿一下spring的ioc和aop思想,歡迎大家進來閱讀指教

可以看出來事務已經送出了,我們來看看資料庫裡面的變化:

tb_user表:

菜鳥簡單模仿一下spring的ioc和aop思想,歡迎大家進來閱讀指教

user_detail表:

菜鳥簡單模仿一下spring的ioc和aop思想,歡迎大家進來閱讀指教

然後在業務層加上

運作結果:

菜鳥簡單模仿一下spring的ioc和aop思想,歡迎大家進來閱讀指教

仔細觀察劃綠色線的部分就能發現,事務已經復原了,看資料庫表也是沒有記錄的

我們主鍵id由于是遞增的,是以我們還要确定一下事務是不是真的復原了,我們把異常代碼去掉,然後再往裡面插入成功一次資料,運作後的資料庫表記錄如下:

tb_user:

菜鳥簡單模仿一下spring的ioc和aop思想,歡迎大家進來閱讀指教

user_detail:

菜鳥簡單模仿一下spring的ioc和aop思想,歡迎大家進來閱讀指教

大家仔細看id,已經是3了,說明原來事務成功復原了

說明:其實connection對象不必每次都作為參數傳遞給方法,這裡隻是為了更清楚的展示connection的流向,其實我們用threadlocal封裝成一個單例的時候就已經注定了本次通路(即目前線程從controller層調用到dao層)所有get到的connection對象都是同一個;

最後,個人感覺這個程式有個非常要命的地方,就是我要給service層加事務代理,這樣就導緻了sevice層的對象不能通過配置檔案來執行個體化,正在糾結中。。以後還會優化,這隻是簡單實作以下,真正的spring要複雜的多得多,第一次發表部落格,以後也會多發一些,大家互相學習~