就Spring IoC容器而言,bean定义基本上描述了创建一个或多个实际bean对象的内容。当需要的时候,容器会从bean定义列表中取得一个指定的bean定义,并根据bean定义里面的配置元数据使用反射机制来创建一个实际的对象。因此这一节将讲解如何告知Spring IoC容器我们将要实例化的对象的类型以及如何实例化对象。
当采用XML描述配置元数据时,将通过<bean/>
元素的class
属性来指定实例化对象的类型。class
属性 (对应BeanDefinition
实例的Class
属性)通常是必须的(不过也有两种例外的情形。class属性主要有两种用途:在大多数情况下,容器将直接通过反射调用指定类的构造器来创建bean(这有点等类似于在Java代码中使用new操作符);在极少数情况下,容器将调用类的静态
工厂方法来创建bean实例,class属性将用来指定实际具有静态
工厂方法的类(至于调用静态工厂方法创建的对象类型是当前class还是其他的class则无关紧要)。
用构造器来实例化
当使用基于XML的元数据配置文件,可以这样来指定bean类:
<bean id="studentBean" class="com.test.StudentBean"/>
使用静态工厂方法实例化
factory-method
属性来指定创建bean实例的工厂方法。Spring将调用此方法(其可选参数接下来介绍)返回实例对象,就此而言,跟通过普通构造器创建类实例没什么两样。下面的bean定义展示了如何通过工厂方法来创建bean实例。注意,在此例中,
getCat()
必须是一个
static方法。
public class Cat {
private String name;
public Cat(String name){
this.name = name;
}
public Cat(){
}
@Override
public String toString() {
return "我是一只猫:"+this.name;
}
}
public class StaticFactory {
public static Cat getCat(String name){
return new Cat(name);
}
}
配置文件
<?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.xsd ">
<!-- class属性值为工厂类的全限定路径;factory-method:指定工厂方法:必须为静态方法 -->
<bean id="cat" class="demo1.StaticFactory" factory-method="getCat">
<!-- 配置静态工厂方法的参数-->
<constructor-arg value="笨笨" />
</bean>
</beans>
测试类:
public class Demo1 {
/**
* @param args
*/
public static void main(String[] args) {
BeanFactory bf = new ClassPathXmlApplicationContext("demo1/applicationContext-bean.xml");
Cat cat = (Cat) bf.getBean("cat");
System.out.println(cat.toString());
}
}
测试结果:
使用实例工厂方法实例化
与使用静态工厂实例化类似,用来进行实例化的实例工厂方法位于另外一个已有的bean中,容器将调用该bean的工厂方法来建一个新的bean实例为使用此机制,class
属性必须为空,而factory-bean
属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该工厂bean的工厂方法本身必须通过factory-method
属性来设定。
<bean id="instanceFactory" class="demo1.InstanceFactory"/>
<bean id="cat" factory-bean="instanceFactory" factory-method="createCat"/>
该方法与静态方法不同处在于需要先在spring容器中注入实例工厂,然后在bean中使用该实例工厂的方法来创建实例(分别通过
factory-bean和factory-method指定)。