2014-03-09 Spring的學習(1)------Spring管理Bean(實例化Bean)

1.搭建與測試Spring的開發環境

 

      PS: Spring-beans-2.5.xsd  (爲使在Beans.xml操做順暢) Perferences--->MyEclipse--->Files and Editors---->XML--->XML Catalog--->add User Specified Entriesjava

     

2.Spring管理Bean小試牛刀

    代碼實現: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學習.框架

3.手動編碼完成部分實例化Bean的工做

 

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);
	}
}

4.Spring的三種實例化Bean的方式

    

 4.1. 用構造器來實例化

當採用構造器來建立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實例設置屬性將在隨後的 部分中談及。測試

4.2. 使用靜態工廠方法實例化

當採用靜態工廠方法建立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實例設置屬性將在隨後的部份中談及。編碼

4.3. 使用實例工廠方法實例化

 使用靜態工廠方法實例化相似,用來進行實例化的非靜態實例工廠方法位 於另一個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)來進行配置。

5.Bean的做用域以及Bean更多知識

   參考:Spring framework 2.5文檔第三章Ioc(控制反轉)容器

相關文章
相關標籤/搜索