BeanFactory为一个管理bean的工厂(即为spring的容器),它管理的对象可以是bean也可以是FactoryBean(这种请况会再调用FactoryBeangetObject()获取真正的bean)
FactoryBean为一个工厂bean,受BeanFactory管理,同时它也管理着一个bean
 
接着来看一看FactoryBean
public interface FactoryBean {
    Object getObject() throws Exception;
    Class getObjectType();
    boolean isSingleton();
}
FactoryBeanspring的一个工厂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")获取的是FactoryBeanBeanId,但返回的是它所管理的Bean实例(FengShan1)。另外,因为在FactoryBeanisSingleton方法返回值为true,因此fengShan1fengShan2将指向同一个引用。