BeanFactory
为一个管理
bean
的工厂(即为
spring
的容器),它管理的对象可以是
bean
也可以是
FactoryBean(
这种请况会再调用
FactoryBean
的
getObject()
获取真正的
bean)
。
FactoryBean
为一个工厂
bean
,受
BeanFactory
管理,同时它也管理着一个
bean
。
接着来看一看
FactoryBean
:
|
public
interface
FactoryBean {
Object getObject()
throws
Exception;
Class getObjectType();
boolean
isSingleton();
}
|
FactoryBean
是
spring
的一个工厂
bean
,他可以管理一个
bean
,通过
isSingleton
方法设置此
bean
是否为单例,通过
getObject
方法获取此
bean
实例的引用,
getObjectType
方法获取此
bean
的类型。记住一点:
FactoryBean
在配置文件中的定义和普通
bean
没有区别,但是当客户端对
beanId
进行请求时,返回的是它管理的
bean
实例引用
(即此
FactoryBean
通过
getObject
获取了它所管理的
bean
实例引用
)。
下面举一个例子来说明:
Fengshan1.java
(此类为被
FactoryBean
管理的类):
|
public class
FengShan1 {
public void descrip(){
System.out.println("
凤山是个美丽的小县城!
");
}
}
|
TianE.java(
此类为继承
FactoryBean
接口的类
)
:
|
public class
TianE implements FactoryBean {
public Object getObject() throws Exception {
return new FengShan1();
}
public Class getObjectType() {
return FengShan1.class;
}
public boolean isSingleton() {
return true;
}
}
|
Beam.xml(spring
配置文件
):
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!
DOCTYPE
beans
PUBLIC
"-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd"
>
<
beans
default-autowire
=
"byName"
>
<!—FactoryBean
配置
-->
<
bean
id
=
"tiane"
class
=
"com.dvnchina.test.TianE"
/>
</
beans
>
|
Test.java(
测试类
)
:
|
public class
Test extends TestCase {
public void test(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
FengShan1 fengShan1 = (FengShan1) ctx.getBean("tiane");
fengShan1.descrip();
FengShan1 fengShan2 = (FengShan1) ctx.getBean("tiane");
System.out.println(fengShan1==fengShan2);
}
}
|
结果:
|
凤山是个美丽的小县城!
true
|
在测试类中,
ctx.getBean("tiane")
获取的是
FactoryBean
的
BeanId
,但返回的是它所管理的
Bean
实例(
FengShan1
)。另外,因为在
FactoryBean
中
isSingleton
方法返回值为
true,
因此
fengShan1
和
fengShan2
将指向同一个引用。
本文转自 yzzh9 51CTO博客,原文链接:http://blog.51cto.com/java999/196400,如需转载请自行联系原作者