依賴注入項目總結

這個小demo代碼量不算多,不過幾百行。

但是寫了兩三天,其中不少地方刪刪改改,最後勉強實現了spring中的核心功能:依賴注入

我本身用過spring和guice這兩種依賴注入框架,spring很強大,沒錯,但是spring一個讓人詬病的地方就是繁雜的配置,幾百行的配置文件都算是基礎。

guice的話,這個框架吸引我的地方就是完全通過java代碼配置,完全扔掉了xml。

無論是哪個框架,都是推薦使用構造器注入,在本次項目當中,也只實現了構造器注入。

那麼這個程序的主要入口就是這個函數:

public static void bind(Class klass)

該函數傳入一個類型,Context根據這個類型,通過反射獲取到何合適的構造器,並獲取到構造器的全部參數類型,

再通過遞歸的方式創造出所需要的對象,以此注入,從而創建對象注入到容器當中。

最基本的原理就是這樣,其他的都是細節,不必深究。

值得注意的是,該程序也實現了aop的基本功能,不論是面向切面編程,還是事務管理,都只是從依賴注入這個基礎功能得來的。

本程序中aop的實現是在創建對象的時候,通過cglib,動態生成一個代理,並在方法被調用之前調用指定的AOPRunnable,該接口:

public interface AOPRunnable {
    Object run(Aspect aspect) throws Throwable;
}

可以根據需要編寫環繞通知:

Context.aop(aspect -> {
            System.out.println(aspect.getMethod()+"被運行");
            return aspect.process();
        });

以上,就是該程序的基本功能。

但該程序還是有一點不足,無法解決循環依賴,構造器注入肯定解決不了這個問題,spring中使用了成員注入,或者是setter注入,當類之間發生循環依賴,肯定會引發Stack Overflow。

有興趣的同學可以去看看:https://github.com/cjp715711877/di

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章