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