阅读:3627次   评论:0条   更新时间:2011-06-01    

简介

org.springframework.beansorg.springframework.context Spring IoC容器的基础。

BeanFactory提供了配制框架及基本功能,ApplicationContext BeanFactory的扩展,增加了更多支持企业核心内容的功能如AOP、资源处理、事务管理等。注意:BeanFactoryApplicationContext都是接口,在应用中至于选择使用哪个接口要根据具体需求来定,由于ApplicationContext接口功能更强大,一般推荐使用此接口。

容器和Bean

Bean就是由Spring容器初始化、装配及管理的对象,定义beanbean之间的依赖关系由配置元数据来描述。

BeanFactorySpring IoC容器的实际代表者,是IoC的核心接口,负责实例化、定位、配置应用程序中的对象及这些对象之间的依赖关系。

XmlBeanFactoryBeanFactory其中的一个实现类,它提供以XML方式描述应用程序对象及其之间的依赖关系。

注意:以XML方式来配置元数据是目前最常用的方式但并不是唯一的描述格式。

Spring IoC容器至少有一个bean的定义,一般有多个。使用XML配置元数据时,在顶层的<beans/>内配置一个或多个<bean/>元素。

Bean的定义与应用程序中实际使用的对象是一一对应的。这些bean包括:服务层对象、DAO对象、类似strutsAction的表现层对象、HibernateSessionFactory对象、JMSQueue对象等。Bean的定义与领域对象不同,领域对象的创建和加载必须依赖具体的DAO和业务逻辑。

以下是Spring配置文件的基本结构:

<?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="..." class="...">

    <!—里面相关的配置放在这 -->

  </bean>

  <bean id="..." class="...">

    <!—里面相关的配置放在这 -->

  </bean>

  <!—其它的定义 -->

</beans>

实例化容器,见下例:

ApplicationContext context = new ClassPathXmlApplicationContext(

        new String[] {"services.xml", "daos.xml"});

BeanFactory  factory = context;

可以将XML配置文件分解成多个文件,另一做法是使用一个或多个的<import/>元素来引入一个或多个bean的定义,注意:<import/>元素要放在<bean/>元素前配置,见下例:

<beans>

    <import resource="services.xml"/>

    <import resource="resources/messageSource.xml"/>

    <import resource="/resources/themeSource.xml"/>

    <bean id="bean1" class="..."/>

    <bean id="bean2" class="..."/>

</beans>

上面导入的文件都是相对路径,最前的’/’不要更好。注意:导入的每个配置文件都必须是完整有效的XML Bean配置文件,即要有Spring配置文件的完整格式。

多种Bean


Bean的定义由BeanDefinition对象来表示,该定义包含全限定类名、bean行为的定义、对其他bean的引用、创建bean实例时的其它配置设置。

Bean的命名

每个bean都有一个或多个id(标识符),每个id必须在当前的IoC容器中唯一,有多个id其实就是别名。Xml配置bean时通过使用idname来指定其标识符。通常建议指定 id,若要指定别名,则在name属性中使用逗号、空格、或冒号将多个id分隔。Beanname属性不是必须的,若没有指定Ioc容器会自动为其生成一个唯一的name

Bean的别名

使用<alias/>元素来指定,如:

<alias name=”fromName” alias=”toName”/>

实例化bean

<bean/>元素的class属性是通常必须的,该属性用来指定实例化对象的类型,该属性的用途有:第一,通常直接使用反射调用类的构造器来创建bean(这是通常情况下);第二,调用类的静态工厂方法来创建bean的实例(这种情况较少)

用构造器来实例化bean

这种方式下class需要一个默认的空的构造器。在容器中使用非bean的形式也是可以的。

使用XML这样指定bean

<bean id="exampleBean" class="examples.ExampleBean"/>

用静态工厂方法实例化bean

此时bean的定义除了需要指定class属性外,还需要factory-method属性来指定使用的工厂方法,如:

<bean id="exampleBean"

      class="examples.ExampleBean2"

      <!—createInstance必须是静态的方法à

      factory-method="createInstance"/>

用实例工厂方法实例化bean

此时bean的定义的class属性必须为空,factory-bean 属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,factory-method属性来设定bean的实例工厂方法,如:

<bean id="serviceLocator" class="com.foo.DefaultServiceLocator">

<!—其它配置à

 </bean>

<bean id="exampleBean"

   <!—此时class属性必须为空à

      factory-bean="serviceLocator"

      factory-method="createInstance"/>

使用容器

通过BeanFactory 我们可以访问bean定义,如:

Resource res = new FileSystemResource("beans.xml");

BeanFactory factory = new XmlBeanFactory(res);

接着使用getBean(String) 方法就可以取得bean的实例

 

--------------------------------------------

本节综合实例:

1、新建一个java工程,名为spring2.5,加入jar包:spring-framework-2.5.5-with-dependencies/lib/jakarta-commons/commons-loggin.jar和spring-framework-2.5.5-with-dependencies/dist/spring.jar即可

2、在工程src下新建spring2.5的配置文件,这里名取为:beans.xml,整个工程测试完后其全部代码如下:

 

<?xml version="1.0" encoding="gbk"?>
<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">
   <!--配置Peson这个bean,使用默认的构造器来实例化bean-->
   <bean id="person" class="com.iwtxokhtd.spring.bean.Person"/>
   <!--使用别名-->
   <alias name="person" alias="anotherPerson"/>
   <!--使用静态工厂方法来实例化bean-->
   <bean id="staticfactory" class="com.iwtxokhtd.spring.bean.StaticFactory"
     factory-method="createInstance"/>
   <!--使用实例工厂方法来实例化bean-->
   <bean id="instancefactory" class="com.iwtxokhtd.spring.bean.InstanceFactory"/>
   <bean id="realinstancefactory" factory-bean="instancefactory" factory-method="createInstance"/>
</beans>

3、测试中用到的bean:

(1)使用默认构造器实例化bean用到的Person.java:

 

 

  

/**
 * 使用默认的构造器实例化bean
 */
package com.iwtxokhtd.spring.bean;

import java.io.Serializable;

/**
 * @author Administrator
 *
 */
//此bean要符合Spring配置文件中对bean定义的规范
public class Person implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 8038645005550821000L;
	//实体标识
	private int id;
	//姓名
	@SuppressWarnings("unused")
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return "使用默认构造器来实例化bean";
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + id;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Person other = (Person) obj;
		if (id != other.id)
			return false;
		return true;
	}
	
	

}

 (2)使用静态工厂方法实例化bean用到的StaticFactory.java:

 

 

 

 

 

/**
 * 使用静态工厂方法实例化bean
 */
package com.iwtxokhtd.spring.bean;

/**
 * @author Administrator
 *
 */
public class StaticFactory {

	private int id;
	@SuppressWarnings("unused")
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return "使用静态工厂方法实例化bean";
	}
	public void setName(String name) {
		this.name = name;
	}
	public static StaticFactory createInstance(){
		return new StaticFactory();
	}
	
}

 (3)使用实例工厂方法实例化bean用到的InstanceFactory.java:

 

/**
 * 使用实例工厂方法实例化bean
 */
package com.iwtxokhtd.spring.bean;

/**
 * @author Administrator
 *
 */
public class InstanceFactory {

	private int id;
	@SuppressWarnings("unused")
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return "使用实例工厂方法实例化bean";
	}
	public void setName(String name) {
		this.name = name;
	}
	public  InstanceFactory createInstance(){
		return new InstanceFactory();
	}
	
}

 

客户端测试类:

/**
 * 读取Spring配置文件测试
 */
package com.iwtxokhtd.xml.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;

import com.iwtxokhtd.spring.bean.InstanceFactory;
import com.iwtxokhtd.spring.bean.Person;
import com.iwtxokhtd.spring.bean.StaticFactory;

/**
 * @author Administrator
 *
 */
public class ReadSpringFileTest {

	public static void main(String[] args) {
		/*
		 * 得到应用程序上下文环境实例
		 * 查找类路径下的beans.xml文件
		 */
		ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
		//若有多个spring配置文件,则可以使用数组,如下:
		//ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"beans.xml","dao.xml"});
		//读取配置文件中的bean
		System.out.println("使用默认构造器来实例化bean");
		System.out.println("------");
		Person person=(Person)context.getBean("person");
		//打印测试结果
		System.out.println("没有用别名:"+person.getName());
		//使用别名
		Person anotherPerson=(Person)context.getBean("anotherPerson");
		System.out.println("使用了别名:"+anotherPerson.getName());
		System.out.println("----------------------");
		System.out.println("使用静态工厂方法来实例化bean");
		System.out.println("------");
		StaticFactory sf=(StaticFactory)context.getBean("staticfactory");
		System.out.println(sf.getName());
		System.out.println("----------------------");
		System.out.println("使用实例工厂方法来实例化bean");
		System.out.println("------");
		InstanceFactory instancefactory=(InstanceFactory)context.getBean("realinstancefactory");
		System.out.println(instancefactory.getName());
		//使用容器的方法
		System.out.println("----------------------");
		System.out.println("使用容器");
		System.out.println("------");
		Resource res=new FileSystemResource("src/beans.xml");
		BeanFactory factory=new XmlBeanFactory(res);
		person=(Person)factory.getBean("person");
		System.out.println("使用了容器来测试:"+person.getName());

	}

}

 

测试结果:

使用默认构造器来实例化bean
------
没有用别名:使用默认构造器来实例化bean
使用了别名:使用默认构造器来实例化bean
----------------------
使用静态工厂方法来实例化bean
------
使用静态工厂方法实例化bean
----------------------
使用实例工厂方法来实例化bean
------
使用实例工厂方法实例化bean
----------------------
使用容器
------
2009-4-8 14:12:29 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [E:\涂继跃\工程测试\Spring2.5\src\beans.xml]
使用了容器来测试:使用默认构造器来实例化bean 

 

 

 

评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

  • iwtxokhtd在2009-04-08创建
  • iwtxokhtd在2011-06-01更新
  • 标签: spring2.5, ioc, 容器, bean
Global site tag (gtag.js) - Google Analytics