7.7.3 调用实例工厂方法创建Bean
实例工厂方法与静态工厂方法只有一点不同:调用静态工厂方法只需使用工厂类即可,而调用实例工厂方法则需要工厂实例。所以配置实例工厂方法与配置静态工厂方法基本相似,只有一点区别:
- 配置静态工厂方法使用
class
指定静态工厂类, - 而配置实例工厂方法则使用
factory-bean
指定工厂实例
使用实例工厂方法时,配置Bean
实例的<bean>
.元素无须class
属性,因为Spring
容器不再直接实例化该Bean
, Spring
容器仅仅调用实例工厂的工厂方法,工厂方法负责创建Bean
实例。
采用实例工厂方法创建Bean
的<bean>
元素时需要指定如下两个属性。
属性 | 描述 |
---|---|
factory-bean |
该属性的值为工厂Bean 的id |
factory-method |
该属性指定实例工厂的工厂方法。 |
与静态工厂方法相似,如果需要在调用实例工厂方法时传入参数,则使用<constructor-arg> 元素指定参数值。 |
程序示例
项目结构
1 | E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\instanceFactory |
Person.java
下面先定义一个Person
接口,实例工厂方法所产生的对象将实现Person
接口
1 | package org.crazyit.app.service; |
该接口定义了Person
的规范,该接口必须拥有两个方法:能打招呼、能告别,实现该接口的类必须实现这两个方法。下面是Person
接口的第一个实现类:American
American.java
1 | package org.crazyit.app.service.impl; |
Chinese.java
下面是Person
接口的第二个实现类:Chinese
:
1 | package org.crazyit.app.service.impl; |
PersonFactory
是负责产生Person
对象的实例工厂,该工厂类里提供了一个getPerson()
方法,该方法根据传入的ethnic
参数决定产生哪种Person
对象。工厂类的代码如下。
PersonFactory.java
1 | package org.crazyit.app.factory; |
上面的PersonFactory
就是一个简单的Person
工厂, getPerson()
方法就是负责生产Person
的工厂方法。由于getPerson()
方法没有使用static
修饰,因此这只是一个实例工厂方法。
配置实例工厂创建Bean
与配置静态工厂创建Bean
基本相似,只需将原来的静态工厂类改为现在的工厂实例即可。该应用的配置文件如下。
beans.xml
1 |
|
调用实例工厂方法创建Bean和调用静态工厂方法创建Bean的异同
调用实例工厂方法创建Bean
,与调用静态工厂方法创建Bean
的用法基本相似。区别如下。
- 配置实例工厂方法创建
Bean
,必须将实例工厂配置成Bean
实例;而配置静态工厂方法创建Bean
,则无须配置工厂Bean
- 配置实例工厂方法创建
Bean
,必须使用factory-bean
属性确定工厂Bean
;而配置静态工厂方法创建Bean
,则使用class
元素确定静态工厂类
相同之处如下:
- 都需要使用
factory-method
属性指定产生Bean
实例的工厂方法。 - 工厂方法如果需要参数,都使用
<constructor-arg>
元素指定参数值。 - 普通的设值注入,都使用
<property>
元素确定参数值。
原文链接: 7.7.3 调用实例工厂方法创建Bean