Spring学习之Bean的创建

 就Spring IoC容器而言,bean定义基本上描述了创建一个或多个实际bean对象的内容。当需要的时候,容器会从bean定义列表中取得一个指定的bean定义,并根据bean定义里面的配置元数据使用反射机制来创建一个实际的对象。因此这一节将讲解如何告知Spring IoC容器我们将要实例化的对象的类型以及如何实例化对象。

 当采用XML描述配置元数据时,将通过<bean/>元素的class属性来指定实例化对象的类型。class 属性 (对应BeanDefinition实例的Class属性)通常是必须的(不过也有两种例外的情形。class属性主要有两种用途:在大多数情况下,容器将直接通过反射调用指定类的构造器来创建bean(这有点等类似于在Java代码中使用new操作符);在极少数情况下,容器将调用类的静态工厂方法来创建bean实例,class属性将用来指定实际具有静态工厂方法的类(至于调用静态工厂方法创建的对象类型是当前class还是其他的class则无关紧要)。

用构造器来实例化
 当采用构造器来创建bean实例时,Spring对class并没有特殊的要求,我们通常使用的class都适用。也就是说,被创建的类并 不需要实现任何特
定的 接口,或以特定的方式编码,只要指定bean的class属性即可。不过根据所采用的IoC类型,class可能需要 一个默认的空构造器。 此外,IoC容器
不仅 限于管理JavaBean,它可以管理 任意 的类。不过大多数使用Spring的人喜欢使用实际的 JavaBean(具有默认的(无参)构造器及setter和getter方法),
但在容器中使用非bean形式(non-bean style)的类也是可以的。比如遗 留系统中的连接池,很显然它与JavaBean规范不符,但Spring也能管理它。

当使用基于XML的元数据配置文件,可以这样来指定bean类:

	<bean id="studentBean" class="com.test.StudentBean"/>
使用静态工厂方法实例化
 当采用静态工厂方法创建bean时,该Bean的class属性的值为创建该对象的 静态工厂类的全限定路径,还需要通过 factory-method属性来指定创建bean实例的工厂方法。Spring将调用此方法(其可选参数接下来介绍)返回实例对象,就此而言,跟通过普通构造器创建类实例没什么两样。下面的bean定义展示了如何通过工厂方法来创建bean实例。注意,在此例中, getCat()必须是一个 static方法。
 Cat类的代码
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());

	}

}
测试结果:

这里的<constructor-arg value="笨笨" />实际上是将参数传递给了getCat()方法,实例化仍在getCat()方法内。
使用实例工厂方法实例化

与使用静态工厂实例化类似,用来进行实例化的实例工厂方法位于另外一个已有的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指定)。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值