1. 程式人生 > >sping Ioc原理及模擬實現

sping Ioc原理及模擬實現

IOC即控制反轉,sping通過配置xml檔案來建立和維護類和類之間的關係,當需要修改類或引數時只需要修改配置檔案而不需要修改程式,這降低了程式中類的耦合性。sping就相當於一個工廠,通過解析xml配置檔案獲得類的屬性,並通過java的反射機制來生成類。

一個sping的簡單例項:

定義Person

class Person
{

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String toString()

{

return name;

}

}


定義Person,Person類有name屬性,實現setter,getter方法

配置xml檔案

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans.xsd

           http://www.springframework.org/schema/context

           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<bean id="person" class="com.tsing.Person">

<property name="name">

<value>Alice</value><!--設定name屬性-->

</property>

</bean>

</beans>

配置sping解析的xml檔案,為Person類注入name屬性

//獲取person物件

public static void main(String[] args) throws Exception
{

ApplicationContext ctx = new ClassPathXmlApplicationContext("com/tsing/beans.xml");

System.out.println((Person) ctx.getBean("person"));

}

sping通過解析xml配置檔案,使用java的反射機制通過建構函式或set方法為類注入屬性,生成類例項,內部通過一個鍵為String值為ObjectHashMap儲存生成的例項,當從sping中獲取類時即從HashMap中獲取String鍵對應的Object.

下面模擬sping Ioc的實現:

實現一個Bean物件,用以模擬xml檔案,儲存設定的類屬性

class Bean
{

private String id;//id

private String type;//class

private Map<String, Object> properties = new HashMap<String, Object>();//properties

public void setId(String id) {

this.id = id;

}

public String getId() {

return id;

}

public void setType(String type) {

this.type = type;

}

public String getType() {

return type;

}

public void setProperties(Map<String, Object> properties) {

this.properties = properties;

}

public Map<String, Object> getProperties() {

return properties;

}

}


實現bean工廠,用以解析Bean,獲取類例項

public class BeanFactory 
{

//儲存生成的類例項,鍵為String,值為Object

private Map<String, Object> beanMap = new HashMap<String, Object>(); 

//建構函式解析配置好的bean,相當於sping中解析xml配置檔案

public BeanFactory(List<Bean> beans)

{

try

{

for(Bean bean : beans)

{

Class<?> clazz = Class.forName(bean.getType());

//生成類

Object obj = clazz.newInstance();

Method[] methods = clazz.getMethods();

for(String name : bean.getProperties().keySet())

{

StringBuilder sb = new StringBuilder(name);

sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));

String methodName = sb.toString();

methodName = "set" + methodName;

for(Method method : methods)

{

//通過set方法設定類的屬性

if(method.getName().equals(methodName))

method.invoke(obj, bean.getProperties().get(name));

}

}

//將生成好的類放入beanMap

beanMap.put(bean.getId(), obj);

}

}

catch (Exception e)

{

e.printStackTrace();

}

}

//獲得bean

public Object getBean(String id)

{

return beanMap.get(id);

}

public static void main(String[] args)

{

ArrayList<Bean> beans = new ArrayList<Bean>();

Bean bean = new Bean();

//生成bean的配置資訊,相當於配置xml檔案

bean.setId("person");

bean.setType("Person");

Map<String, Object> properties = new HashMap<String, Object>();

//配置屬性

properties.put("name", "Alice");

properties.put("id", 11);

bean.setProperties(properties);

beans.add(bean);

//解析配置好的bean

BeanFactory factory = new BeanFactory(beans);

//獲取person類

Person person = (Person) factory.getBean("person");

System.out.println(person);

}

}

執行結果:

Alice

至此,一個簡單的sping Ioc模擬告一段落。

相關推薦

sping Ioc原理模擬實現

IOC即控制反轉,sping通過配置xml檔案來建立和維護類和類之間的關係,當需要修改類或引數時只需要修改配置檔案而不需要修改程式,這降低了程式中類的耦合性。sping就相當於一個工廠,通過解析xml配置檔案獲得類的屬性,並通過java的反射機制來生成類。 一個sping的

【進階3-5期】深度解析 new 原理模擬實現

本週的主題是this全面解析,本計劃一共28期,每期重點攻克一個面試重難點,如果你還不瞭解本進階計劃,文末點選檢視全部文章。 如果覺得本系列不錯,歡迎點贊、評論、轉發,您的支援就是我堅持的最大動力。 介紹下定義 new 運算子建立一個使用者定義的物件型別的例項或具有建構函式的內建物件的例項。

【進階3-5期】深度解析 new 原理模擬實現(轉)

這是我在公眾號(高階前端進階)看到的文章,現在做筆記 https://github.com/yygmind/blog/issues/24 new 運算子建立一個使用者定義的物件型別的例項或具有建構函式的內建物件的例項。 ——(來自於MDN) 舉個例子: function Car(color) {

光場相機原理模擬實現

估計是因為最近Lytro二代的上市吧,光場相機的概念就又火了一把。藉著昨天晚上無意間看到知乎上關於光場相機的問答,我就在此獻醜,說下當初我對光場相機的一些理解。 需要指出的是,現在所說的光場相機有很多種,比如魅族的偽光場相機(說是偽光場相機我都覺得坑爹,

最近最久未使用(LRU)頁面置換演算法原理模擬實現

FIFO演算法的效能較差,它所依據的條件是各個頁面調入記憶體的時間,而頁面調入的先後並不能反映頁面的使用狀況。最近最久未使用(LRU)的頁面置換演算法是根據頁面調入記憶體後的使用情況做出決策的。由於無法預測各頁面將來的使用情況,只能利用“最近的過去”作為“最近的

【進階3-4期】深度解析bind原理、使用場景模擬實現

本週的主題是this全面解析,本計劃一共28期,每期重點攻克一個面試重難點,如果你還不瞭解本進階計劃,文末點選檢視全部文章。 如果覺得本系列不錯,歡迎點贊、評論、轉發,您的支援就是我堅持的最大動力。 bind() bind() 方法會建立一個新函式,當這個新函式被呼叫時,它的 this 值是傳

Spring系列之IOC原理手動實現

導語 Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。也是幾乎所有Java工作者必須要掌握的框架之一,其優秀的設計思想以及其程式碼實現上的藝術也是我們需要掌握的。要學習Spring,除了在我們的專案中使用之外,也需要對它的原始碼進行研讀,但是Spring的實現涵蓋

【進階3-4期】深度解析bind原理、使用場景模擬實現(轉)

這是我在公眾號(高階前端進階)看到的文章,現在做筆記  https://github.com/yygmind/blog/issues/23 bind() bind() 方法會建立一個新函式,當這個新函式被呼叫時,它的 this 值是傳遞給 bind(

雙目相機標定以及立體測距原理OpenCV實現

ada eps 左右 flag 並且 length turn iostream 中一 作者:dcrmg 單目相機標定的目標是獲取相機的內參和外參,內參(1/dx,1/dy,Cx,Cy,f)表征了相機的內部結構參數,外參是相機的旋轉矩陣R和平移向量t。內參中dx和d

Vue數據綁定原理簡單實現

fragement observe images als 統一 rst react github上 each 本篇文章中的代碼只是部分片段,完整代碼存放於github上https://github.com/Q-Zhan/simple-vue。 進入正文~實現數據綁定主要是要

Spring 容器IOC解析簡單實現

interface utf-8 cat container 就是 pat 註入 () class 最近一段時間,“容器”兩個字一直縈繞在我的耳邊,甚至是吃飯、睡覺的時候都在我腦子裏蹦來蹦去的。隨著這些天一次次的交流、討論,對於容器的理解也逐漸加深。理論上的東西終歸要落實到實

常見的查找算法的原理python實現

put arch img 字典 python實現 需要 技術 () one 順序查找 二分查找 練習 一、順序查找 data=[1,3,4,5,6] value=1 def linear_search(data,value): flag=False

短時傅裏葉變換(Short Time Fourier Transform)原理 Python 實現

src 參考 函數 ade block return 技術 數學公式 def 原理   短時傅裏葉變換(Short Time Fourier Transform, STFT) 是一個用於語音信號處理的通用工具.它定義了一個非常有用的時間和頻率分布類, 其指定了任意信號隨時間

C++智能指針,指針容器原理簡單實現(auto_ptr,scoped_ptr,ptr_vector).

同時 構造對象 pop 所有 main 操作 bject str 運算 目錄 C++智能指針,指針容器原理及簡單實現(auto_ptr,scoped_ptr,ptr_vector). auto_ptr scoped_ptr ptr_vector C++智能指針,指針容器

線程池原理python實現

source 實例 以及 代碼 let range python實現 queue 上界 https://www.cnblogs.com/goodhacker/p/3359985.html 為什麽需要線程池   目前的大多數網絡服務器,包括Web服務器、Email服務器以

菜鳥學SSH——Spring容器IOC解析簡單實現

最近一段時間,“容器”兩個字一直縈繞在我的耳邊,甚至是吃飯、睡覺的時候都在我腦子裡蹦來蹦去的。隨著這些天一次次的交流、討論,對於容器的理解也逐漸加深。理論上的東西終歸要落實到實踐,今天就藉助Spring容器實現原理,簡單說說吧。 簡單的說,Spring就是通過工廠+反射將我們的bean放到它

OpenCV(一)——高斯卷積核原理程式碼實現

貼出getGaussianKernel原始碼 在smooth.cpp中 提示:Gaussian核基於 正態分佈函式設計 μ是均值,σ^2是方差 正態函式(即一維Gaussian卷積核)如下 二維卷積核通過對一維積分得到,並且μ = 0 根據如下原始碼可知

微信公眾號掃碼登陸原理程式碼實現

1.使用者開啟公眾號點選掃碼功能(注意我們用 scancode_waitmsg這種型別即可)  2.使用者掃描了二維碼會給微信傳送資訊,然後微信把資訊以XML格式傳送給我們的伺服器 3.接收資料,並把資料保存於資料庫或者快取,程式碼如下: $wechatObj = new

蒙特.卡羅方法求解圓周率近似值原理程式碼實現

原理 對於某些不能精確求解的問題,蒙特.卡羅方法是一種非常巧妙的尋找近似解的方法。 以求解圓周率的問題為例,假設有一個單位圓及其外切正方形,我們往正方形內扔飛鏢,當扔的次數足夠多以後,“落在圓內的次數/落在正方形內的次數”這個比值會無限接近“圓的面積/

大資料教程(8.2)wordcount程式原理程式碼實現/執行

        上一篇部落格分享了mapreduce的程式設計思想,本節博主將帶小夥伴們瞭解wordcount程式的原理和程式碼實現/執行細節。通過本節可以對mapreduce程式有一個大概的認識,其實hadoop中的map、reduce程