PS: Spring-beans-2.5.xsd (爲使在Beans.xml操做順暢) Perferences--->MyEclipse--->Files and Editors---->XML--->XML Catalog--->add User Specified Entriesjava
代碼實現:spring
PersonServiceImpl.java
/**實現類**/ 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/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- 構造器實例對象 !--> <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 { @Test public void instaceBean() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); PersonService serviceBean = (PersonService)context.getBean("personService"); serviceBean.add(); } } //output: This is a add() //~
PS:能夠經過Spring Framework 開發參考手冊或者自帶API學習.框架
BeanDefinition.java 配置Beans.xml文件中相對應的元素
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(); } /** * 實例化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相關知識**/ for(Element element : elements){ String id = element.attributeValue("id"); //獲取id元素對應值 String clazz = element.attributeValue("class"); //獲取class元素對應值 BeanDefinition beanDfine = new BeanDefinition(id,clazz); BeanDefinitions.add(beanDfine); } }catch (Exception e) { e.printStackTrace(); } } /** * 獲取Bean實例 * @param beanName * @return */ public Object getBean(String beanName){ return this.sigletons.get(beanName); } }
當採用構造器來建立bean實例時,Spring對class並無特殊的要求, 咱們一般使用的class都適用。也就是說,被建立的類並不須要實現任何特定的 接口,或以特定的方式編碼,只要指定bean的class屬性便可。不過根據所採用 的IoC類型,class可能須要一個默認的空構造器。dom
此外,IoC容器不只限於管理JavaBean,它能夠管理任意 的類。不過大多數使用Spring的人喜歡使用實際的JavaBean(具備默認的(無參)構造器 及setter和getter方法),但在容器中使用非bean形式(non-bean style)的類也是可 以的。好比遺留系統中的鏈接池,很顯然它與JavaBean規範不符,但Spring也能管理它。函數
當使用基於XML的元數據配置文件,能夠這樣來指定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"/>
給構造函數指定參數以及爲bean實例設置屬性將在隨後的 部分中談及。測試
當採用靜態工廠方法建立bean時,除了須要指定class
屬性外,還須要經過factory-method
屬性來指定建立bean實例 的工廠方法。Spring將調用此方法(其可選參數接下來介紹)返回實例對象,就此而言, 跟經過普通構造器建立類實例沒什麼兩樣。ui
下面的bean定義展現瞭如何經過工廠方法來建立bean實例。注意,此定義並 未指定返回對象的類型,僅指定該類包含的工廠方法。在此例中, createInstance()
必須是一個static方法。this
<bean id="exampleBean" class="examples.ExampleBean2" factory-method="createInstance"/> <bean id="personServiceFactory" class="cn.itcast.service.impl.PersonServiceImplFactory" factory-method="getPersonServiceImpl"/>
給工廠方法指定參數以及爲bean實例設置屬性將在隨後的部份中談及。編碼
與 使用靜態工廠方法實例化相似,用來進行實例化的非靜態實例工廠方法位 於另一個bean中,容器將調用該bean的工廠方法來建立一個新的bean實例。爲使 用此機制,class
屬性必須爲空,而factory-bean
屬性必須指定爲當前(或其祖先)容器中包含工廠方法的bean的名稱,而該 工廠bean的工廠方法自己必須經過factory-method
屬性來設定。
<!-- 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"/>
雖然設置bean屬性 的機制仍然在這裏被說起,但隱式的作法是由工廠bean本身來管理以及經過依 賴注入(DI)來進行配置。