简介
org.springframework.beans及org.springframework.context包 是Spring IoC容器的基础。
BeanFactory提供了配制框架及基本功能,ApplicationContext 是BeanFactory的扩展,增加了更多支持企业核心内容的功能如AOP、资源处理、事务管理等。注意:BeanFactory和ApplicationContext都是接口,在应用中至于选择使用哪个接口要根据具体需求来定,由于ApplicationContext接口功能更强大,一般推荐使用此接口。
容器和Bean
Bean就是由Spring容器初始化、装配及管理的对象,定义bean及bean之间的依赖关系由配置元数据来描述。
BeanFactory是Spring IoC容器的实际代表者,是IoC的核心接口,负责实例化、定位、配置应用程序中的对象及这些对象之间的依赖关系。
XmlBeanFactory是BeanFactory其中的一个实现类,它提供以XML方式描述应用程序对象及其之间的依赖关系。
注意:以XML方式来配置元数据是目前最常用的方式但并不是唯一的描述格式。
Spring IoC容器至少有一个bean的定义,一般有多个。使用XML配置元数据时,在顶层的<beans/>内配置一个或多个<bean/>元素。
Bean的定义与应用程序中实际使用的对象是一一对应的。这些bean包括:服务层对象、DAO对象、类似struts的Action的表现层对象、Hibernate的SessionFactory对象、JMS的Queue对象等。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时通过使用id或name来指定其标识符。通常建议指定 id,若要指定别名,则在name属性中使用逗号、空格、或冒号将多个id分隔。Bean的name属性不是必须的,若没有指定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,整个工程测试完后其全部代码如下:
3、测试中用到的bean: (1)使用默认构造器实例化bean用到的Person.java: (2)使用静态工厂方法实例化bean用到的StaticFactory.java: (3)使用实例工厂方法实例化bean用到的InstanceFactory.java: 客户端测试类: 测试结果: 使用默认构造器来实例化bean <?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>
/**
* 使用默认的构造器实例化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;
}
}
/**
* 使用静态工厂方法实例化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();
}
}
/**
* 使用实例工厂方法实例化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
----------------------
使用容器
------
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