Spring學習
Spring可以支持根據Xml文件來創建物建,及設定物件的初始配置,代替直接在程序裡面寫相應代碼.
遵從Spring所用的Xml語法:
首先有一個頂層的標籤:
<beans>
</beans>
裡面可起嵌套多個JavaBean.一個<bean>標籤可以幫你創建一個相應Bean的物件,必須用一個名稱來標示他.
名稱是唯一的,就像Java的變數一樣,不能重複定義.當然還要指定生成哪個JavaBean的物件
<bean id="Kiyohara" class="jp.co.KiyoharaTakuya.spring.HelloSpring">
</bean>
這樣就會調用無參構造函數生成一個Bean物件.也可以通過指定參數調用有參構造函數.
在<Bean>標籤中嵌套0個到多個<construct-arg>標籤來指定每個參數的值.
如;
<beans>
<bean ...>
<construct-arg>[表示值的標籤]</construct-arg> <!--第一個參數-->
<construct-arg>[表示值的標籤]</construct-arg> <!--第二個參數-->
</bean>
</beans>
如此這般,就會調用有參構造函數了
不只是能創建物建.還可以設置各個屬性的值
<beans>
<bean ...>
<construct-arg>[表示值的標籤]</construct-arg> <!--第一個參數-->
<construct-arg>[表示值的標籤]</construct-arg> <!--第二個參數-->
<property name="age">[表示值的標籤]</property> <!--呼叫該Bean的 setAge(...)函數哦-->
<property name="height">[表示值的標籤]</property> <!--呼叫該Bean的 setHeight(...)函數哦-->
</bean>
</beans>
現在到了重點了.就是[表示值的標籤]到底是什麼樣的標籤呢
不同的值標籤代表著不同的數據結構.
有<value><list><map><set><pros><ref>等標籤.
<value>值,如字串,實數,整數,布爾等</value>
<list>表示順序的數據結構.包括數組,跟List接口用的
<map>鍵值對用
<props>屬性用,存的都是String
<ref>表示引用,可以通過指定其他的Bean的ID來指名引用的對象
<value>20</value> <!--表示20的值.Spring會根據參數類型轉換到String或int等-->
<list> <!--從第三項看來,這應該是個字串數組-->
[表示值的標籤]
<value>20</value> <!--若沒有第三項,這個數組會根據情況判斷類型.我沒有是過,請見諒-->
<value>24</value>
<value>26abcde</value>
<list>
<set>
[表示值的標籤]
<value>20</value>
<value>20</value> <!--set.size()應該是1才對,請大家試試看-->
</set>
<map>
<entry key="Key1">[表示值的標籤]</entry>
<entry key="Key2">[表示值的標籤]</entry>
<entry key="Key3"><value>3</value></entry>
</map>
<props>
<prop key="Key1">sssss</prop> <!--由於必存字串,所以裡面的sssss會被解釋為"sssss"-->
</pros>
<ref bean="Kiyohara" /> 這樣就表示一個引用,引用到之前創建的bean--> id="Kiyohara"的那個Bean
在此之前,還要扯遠一下,來看一下FactoryBean
用上面的標籤可以得到一個普通的JavaBean.也就是一個普普通通的類.
FactoryBean是Bean工廠.用他來創建Bean物件,而不是由Xml來創建了.我感覺上這樣可以起到對該bean物件的操作的隱藏效果.
一個類實現了FactoryBean接口.首先就被逼著寫三個函數.getObject,getObjectType等.另一個先省略.這樣你的類就是個工廠類了
很聰明的Spring會判斷在<bean>標籤中指定的class. 若為工廠類的話,將調用該接口的getObject方法取得物件並返回給程序.
若是普通類的話,就返回該物件.這一點是要注意的.
好了,接下來就是解析了
Spring的Jar包中有提供BeanFactory接口.由此接口衍生出很多解釋用的類.我們現在關注的是XmlBeanFactory.
他用於解析Xml來創建物件模型.傳給一個Resource類的物件就行了.常用的有ClassPathResource跟FileSystemResource.
用他們來指定文件.然後就可以來用了.
下面來看看代碼:
BeanFactory bf = new XmlBeanFactory( new ClassPathResource( "myspring.xml" ) );
Object obj = bf.getBean("Kiyohara"); //######注意!!!!
if( obj instanceof Student )
{
Student Kiyohara = (Student)obj;
System.out.println(Kiyohara.getAge() );
}
注意第二行.就是用BeanFactory::getBean中指定Id來取得配置文件中相應Bean的物件的.他內部就是會判斷是否有實現FactoryBean,
然後考慮是否調用FactoryBean::getObject來取得物件.如果有實現的話,上述的obj就是getObject返回的物件.注意!
今天寫累了.第一次寫blog.多多指教