javascript
2014-03-09 Spring的学习(1)------Spring管理Bean(实例化Bean)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1.搭建與測試Spring的開發(fā)環(huán)境
?
? ? ? PS: Spring-beans-2.5.xsd ?(為使在Beans.xml操作順暢) Perferences--->MyEclipse--->Files and Editors---->XML--->XML Catalog--->add User Specified Entries
? ? ?
2.Spring管理Bean小試牛刀
? ? 代碼實(shí)現(xiàn):
PersonServiceImpl.java /**實(shí)現(xiàn)類**/ package?cn.itcast.service.impl;import?cn.itcast.dao.PersonDao; import?cn.itcast.service.PersonService;public?class?PersonServiceImpl?implements?PersonService?{public?void?add(){System.out.println("This?is?a?add()");} }? ?
Beans.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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><!--?構(gòu)造器實(shí)例對象?!--><bean?id="personService"?class="cn.itcast.service.impl.PersonServiceImpl"?scope="prototype"/> </beans> SpringTest.java測試類(用JUNIT框架測試) package?cn.itcast.test;import?org.junit.Test; import?org.springframework.context.support.ClassPathXmlApplicationContext;import?cn.itcast.dao.PersonDao; import?cn.itcast.mycontext.MyClassPathXmlApplicationContext; import?cn.itcast.service.PersonService;public?class?SpringTest?{@Testpublic?void?instaceBean()?{ClassPathXmlApplicationContext?context?=?new?ClassPathXmlApplicationContext("beans.xml");PersonService?serviceBean?=?(PersonService)context.getBean("personService");serviceBean.add();} } //output: This?is?a?add() //~?PS:可以通過Spring Framework 開發(fā)參考手冊或者自帶API學(xué)習(xí).
3.手動編碼完成部分實(shí)例化Bean的工作
?
BeanDefinition.java?配置Beans.xml文件中相對應(yīng)的元素 package?cn.itcast.mycontext; public?class?BeanDefinition?{private?String?id;private?String?className;public?BeanDefinition(String?id,?String?clazz)?{this.id=id;this.className?=?clazz;}public?String?getId()?{return?id;}public?void?setId(String?id)?{this.id?=?id;}public?String?getClassName()?{return?className;}public?void?setClassName(String?className)?{this.className?=?className;} } MyClassPathXmlApplicationContext.java?讀取Beans.xml package?cn.itcast.mycontext;import?java.lang.reflect.Method; import?java.net.URL; import?java.util.ArrayList; import?java.util.HashMap; import?java.util.List; import?java.util.Map;import?org.dom4j.Document; import?org.dom4j.Element; import?org.dom4j.XPath; import?org.dom4j.io.SAXReader;public?class?MyClassPathXmlApplicationContext?{private?List<BeanDefinition>?BeanDefinitions?=?new?ArrayList<BeanDefinition>();/**Key:id???Value:instaceBean?**/private?Map<String,Object>?sigletons?=?new?HashMap<String,Object>();public?MyClassPathXmlApplicationContext(String?filename){this.readXml(filename);this.instaceBeans();}/***?實(shí)例化Bean*/private?void?instaceBeans()?{for(BeanDefinition?beanDefinition:BeanDefinitions){if(beanDefinition.getClassName()!=null?&&?beanDefinition.getClassName().trim()!=""){try?{sigletons.put(beanDefinition.getId(),?Class.forName(beanDefinition.getClassName()).newInstance());}?catch?(InstantiationException?|?IllegalAccessException|?ClassNotFoundException?e)?{e.printStackTrace();}}}}/***?讀取配置Bean的XML文件*?dom4j-1.6.1.jar,jaxen-1.1-beta-6.jar*?@param?filename*/private?void?readXml(String?filename)?{SAXReader?reader?=?new?SAXReader();Document?document?=?null;try{URL?url?=?this.getClass().getClassLoader().getResource(filename);document?=?reader.read(url);Map<String,String>?nsMap?=?new?HashMap<String,String>();nsMap.put("ns","http://www.springframework.org/schema/beans");XPath?xsub?=??document.createXPath("//ns:beans/ns:bean");xsub.setNamespaceURIs(nsMap);@SuppressWarnings("unchecked")List<Element>?elements?=?xsub.selectNodes(document);/**dom4j相關(guān)知識**/for(Element?element?:?elements){String?id?=?element.attributeValue("id");??//獲取id元素對應(yīng)值String?clazz?=?element.attributeValue("class");?//獲取class元素對應(yīng)值BeanDefinition?beanDfine?=?new?BeanDefinition(id,clazz);BeanDefinitions.add(beanDfine);}}catch?(Exception?e)?{e.printStackTrace();}}/***?獲取Bean實(shí)例*?@param?beanName*?@return*/public?Object?getBean(String?beanName){return?this.sigletons.get(beanName);} }4.Spring的三種實(shí)例化Bean的方式
? ??
?4.1.?用構(gòu)造器來實(shí)例化
當(dāng)采用構(gòu)造器來創(chuàng)建bean實(shí)例時,Spring對class并沒有特殊的要求, 我們通常使用的class都適用。也就是說,被創(chuàng)建的類并不需要實(shí)現(xiàn)任何特定的 ?接口,或以特定的方式編碼,只要指定bean的class屬性即可。不過根據(jù)所采用 的IoC類型,class可能需要一個默認(rèn)的空構(gòu)造器。
此外,IoC容器不僅限于管理JavaBean,它可以管理任意 ?的類。不過大多數(shù)使用Spring的人喜歡使用實(shí)際的JavaBean(具有默認(rèn)的(無參)構(gòu)造器 ?及setter和getter方法),但在容器中使用非bean形式(non-bean style)的類也是可 ?以的。比如遺留系統(tǒng)中的連接池,很顯然它與JavaBean規(guī)范不符,但Spring也能管理它。
當(dāng)使用基于XML的元數(shù)據(jù)配置文件,可以這樣來指定bean類:
<!--?id值特殊字符集不能使用??!--> <bean?id="exampleBean"?class="examples.ExampleBean"/>? <bean?name="anotherExample"?class="examples.ExampleBeanTwo"/> <bean?id="personService"?class="cn.itcast.service.impl.PersonServiceImpl"?scope="prototype"/>給構(gòu)造函數(shù)指定參數(shù)以及為bean實(shí)例設(shè)置屬性將在隨后的 部分中談及。
4.2.?使用靜態(tài)工廠方法實(shí)例化
當(dāng)采用靜態(tài)工廠方法創(chuàng)建bean時,除了需要指定class 屬性外,還需要通過factory-method屬性來指定創(chuàng)建bean實(shí)例 ?的工廠方法。Spring將調(diào)用此方法(其可選參數(shù)接下來介紹)返回實(shí)例對象,就此而言, 跟通過普通構(gòu)造器創(chuàng)建類實(shí)例沒什么兩樣。
下面的bean定義展示了如何通過工廠方法來創(chuàng)建bean實(shí)例。注意,此定義并 未指定返回對象的類型,僅指定該類包含的工廠方法。在此例中, createInstance()必須是一個static方法。
<bean?id="exampleBean"?class="examples.ExampleBean2"??factory-method="createInstance"/><bean?id="personServiceFactory"?class="cn.itcast.service.impl.PersonServiceImplFactory"factory-method="getPersonServiceImpl"/>給工廠方法指定參數(shù)以及為bean實(shí)例設(shè)置屬性將在隨后的部份中談及。
4.3. 使用實(shí)例工廠方法實(shí)例化
與 ?使用靜態(tài)工廠方法實(shí)例化類似,用來進(jìn)行實(shí)例化的非靜態(tài)實(shí)例工廠方法位 于另外一個bean中,容器將調(diào)用該bean的工廠方法來創(chuàng)建一個新的bean實(shí)例。為使 ?用此機(jī)制,class屬性必須為空,而factory-bean ?屬性必須指定為當(dāng)前(或其祖先)容器中包含工廠方法的bean的名稱,而該 工廠bean的工廠方法本身必須通過factory-method屬性來設(shè)定。
<!--?the?factory?bean,?which?contains?a?method?called?createInstance()?--> <bean?id="serviceLocator"?class="com.foo.DefaultServiceLocator">??? <!--?inject?any?dependencies?required?by?this?locator?bean?-->? </bean>? <!--?the?bean?to?be?created?via?the?factory?bean?-->? <bean?id="exampleBean"??factory-bean="serviceLocator"???factory-method="createInstance"/><!--?MyDemo?--><bean?id="personServiceFactory2"?class="cn.itcast.service.impl.PersonServiceImplFactory"/><bean?id="personServiceFactory3"?factory-bean="personServiceFactory2"factory-method="getPersonServiceImpl2"/>雖然設(shè)置bean屬性 ?的機(jī)制仍然在這里被提及,但隱式的做法是由工廠bean自己來管理以及通過依 賴注入(DI)來進(jìn)行配置。
5.Bean的作用域以及Bean更多知識
? ?參考:Spring framework 2.5文檔第三章Ioc(控制反轉(zhuǎn))容器
轉(zhuǎn)載于:https://my.oschina.net/codeWatching/blog/206618
總結(jié)
以上是生活随笔為你收集整理的2014-03-09 Spring的学习(1)------Spring管理Bean(实例化Bean)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery实现星星评分功能
- 下一篇: Linux系统如何在开机时修改root密