欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三种实例化Bean的方式

程序员文章站 2022-05-23 18:19:54
...

  从本质上来说,bean定义描述了如何创建一个或多个对象实例。当需要的时候,容器会从bean定义列表中取得一个指定的bean定义,并根据bean定义里面的配置元数据使用反射机制 来创建(或取得)一个实际的对象。当采用XML描述配置元数据时,将通过<bean/> 元素的class 属性来指定实例化对象的类型。class属性主要有两种用途 :在大多数情况下,容器将直接通过反射调用指定类的构造器来创建bean(这有点类似于 在Java代码中使用new 操作符);在极少数情况下,容器将调用类的静态 工厂 方法来创建bean实例,class 属性将用来指定实际具有静态 工厂方法的类(至于调用静态工厂 方法创建的对象类型是当前class还是其他的class则无关紧要)。

注意:如果需要你希望将一个静态 的内部类配置为 一个bean的话,那么内部类的名字需要采用二元 的写法。比如说,在com.example 包下有一个叫Foo 的类,而Foo 类有一个静态 的内部类叫Bar ,那么在bean定义的时候, class 属性必须这样写:com.example.Foo$Bar 。注意这里我们使用了$ 字符将内部类和外部类进行分隔

1使用类构造器实例化

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

<bean id="personService" class="examples.test.PersonServiceBean" />

PersonServiceBean类代码如下所示:

package examples.test;
public class PersonServiceBean implements PersonService {
	public void save(){
		System.out.println("我是save()方法");
	}
} 

2. 使用静态工厂方法实例化

当采用静态工厂方法创建bean时,除了需要指定class 属性外,还需要通过factory-method属性来指定创建bean实例的工厂方法。Spring将调用此方法返回实例对象,就此而言, 跟通过普通构造器创建类实例没什么两样。
  注意:createPersonServiceBean必须是一个static方法。

<bean id="personService2" class="examples.test.PersonServiceBeanFactory"
          factory-method="createPersonServiceBean"/>

 PersonServiceBeanFactory的代码如下所示:

package examples.test;
public class PersonServiceBeanFactory {
	public static PersonServiceBean createPersonServiceBean(){
		return new PersonServiceBean();
	}
}

 3. 使用实例工厂方法实例化

与使用静态工厂方法实例化类似,用来进行实例化的非静态实例工厂方法位于另外一个bean中,容器将调用该bean的工厂方法来创建一个新的PersonServiceBean实例。为使用此机制,class 属性必须为空,而factory-bean 属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该工厂bean的工厂方法本身必须通过factory-method 属性来设定。

注意:createPersonServiceBean2不再需要是一个static方法。

<bean id="personServiceFactory"
		class="examples.test.PersonServiceBeanFactory">
	</bean>
<bean id="personService3" factory-bean="personServiceFactory"
		factory-method="createPersonServiceBean2">

 PersonServiceBeanFactory的代码如下所示:

package examples.test;
public class PersonServiceBeanFactory {
	public PersonServiceBean createPersonServiceBean2(){
		return new PersonServiceBean();
	}
}