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将指向同一个引用。