自己用Java實現一個依賴注入框架 (學習Spring源碼並寫一個簡單的Spring框架)- containerx(含github源碼)

摘要: 自己用Java實現一個依賴注入框架

自己寫一個Spring框架?博主,你在開玩笑嗎?NO! 通過研究了Spring源碼的核心思想,自己用寫一個小框架,加載類似的beans.xml配置,並且把bean都以單例方式註冊到容器中,並且用InvocationHandler來實現AOP這個,就是核心思想,而且具備可行性。只不過沒有Spring源碼那樣處理其它的細枝末節。

容器的本質是什麼?--ConcurrentHashMap!

key是bean的name, value就是那個單例bean。有沒有感覺豁然開朗?這樣可以實現帶依賴注入功能的容器。

InvocationHandler,還有Proxy.newProxyInstance()...  靈光一閃,是不是有實現AOP的思路了?

 

 我通過學習郝佳編著的書籍《Spring源碼深度解析》,根據Spring的基本原理。寫出了一個雛形的依賴注入框架,取名爲containerx。 項目的源碼地址爲https://github.com/liushaoming/containerx

 

代碼片段如下


public static void inject(Object bean, Map<String, String> properties) {
		Map<String, String> methodMap = new HashMap<String, String>();
		for (Map.Entry<String, String> entry : properties.entrySet()) {
			String configName = entry.getKey();
			String configValue = entry.getValue();
			String configMethodName = "";
			if (configName != null && configName.length() > 0) {
				configMethodName = "set" + String.valueOf(configName.charAt(0)).toUpperCase() + configName.substring(1);
			}
			methodMap.put(configMethodName, configValue);
		}
		
		Class clazz = bean.getClass();
		for (Method method : clazz.getMethods()) {
			String methodName = method.getName();
			if (methodName.startsWith("set") && method.getParameterTypes().length == 1
					&& Modifier.isPublic(method.getModifiers())
					&& methodMap.containsKey(methodName)) {
				try {
					method.invoke(bean, methodMap.get(methodName));
				} catch (Exception e) {
					e.printStackTrace();
				} 
			}
		}
	}

 項目的源碼地址爲https://github.com/liushaoming/containerx
如果覺得有用,歡迎star。

加羣討論

 

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