這個小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