這裡將模仿Spring實現一種基於xml設定檔的依賴注入機制。檔案中將實現3中注入,一是單值注入 ,包括int,float,double,char等,也包括String注入;二是Java容器注入,包括List,Set,Map三種 容器的注入,最後一種是java bean對象注入。
實現的機制是,使用Dom4j對xml設定檔進行解析,這裡使用dom4j的Element Handler機制,一種類 似與責任鏈模式的實現機制;對於java對象的構建使用反射機制,這裡主要是針對得到的類的Field進行 set賦值。我試圖通過調用Method的invoke方法調用類本身的setter方法,但是由於通過xml解析得到的值 都是String,如果將這些String動態轉換為相應的確定類型是個痛點,Method的invoke方法,如果形參 是int,而傳入java.lang.Integer,它不會認,所以嘗試失敗,只能通過Field的set方法傳入特定值。
設定檔setting.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="me" class="com.zj.ioc.di.imp.Person">
<property name="name">
<value>ZJ</value>
</property>
<property name="age">
<value>26</value>
</property>
<property name="height">
<value>1.78</value>
</property>
</bean>
<bean id="you" class="com.zj.ioc.di.imp.Person">
<property name="name">
<value>Mary</value>
</property>
<property name="age">
<value>27</value>
</property>
<property name="height">
<value>1.66</value>
</property>
</bean>
<bean id="myList" class="com.zj.ioc.di.imp.ListOne">
<property name="msg">
<list>
<value>java</value>
<value>c</value>
<value>windows</value>
</list>
</property>
</bean>
<bean id="mySet" class="com.zj.ioc.di.imp.SetOne">
<property name="msg">
<set>
<value>tom</value>
<value>cat</value>
<value>dog</value>
</set>
</property>
</bean>
<bean id="myMap" class="com.zj.ioc.di.imp.MapOne">
<property name="msg">
<map>
<entry key="c">
<value>CHINA</value>
</entry>
<entry key="j">
<value>JAPAN</value>
</entry>
<entry key="k">
<value>KOREA</value>
</entry>
</map>
</property>
</bean>
<bean id="us" class="com.zj.ioc.di.imp.Persons">
<property name="i">
<ref bean="me" />
</property>
<property name="u">
<ref bean="you" />
</property>
</bean>
</beans>