BeanFactory 为一个管理 bean 的工厂(即为 spring 的容器),它管理的对象可以是 bean 也可以是 FactoryBean( 这种请况会再调用 FactoryBean getObject() 获取真正的 bean)
FactoryBean 为一个工厂 bean ,受 BeanFactory 管理。
 
先来看一看 BeanFactory
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&" ;
Object getBean(String name);
Object getBean(String name, Class requiredType);
boolean containsBean(String name);
boolean isSingleton(String name);
boolean isPrototype(String name);
boolean isTypeMatch(String name, Class targetType);
Class getType(String name);
String[] getAliases(String name);
}
 
BeanFactory 调用者只需要调用 getBean 方法即可获得指定 bean 的引用。
  BeanFactory与FactoryBean1_第1张图片
 
ApplicationContext 继承自 BeanFactory ,它拥有 BeanFactory 提供的所有配置框架和基本的功能, 而且 ApplicationContext 为它增加了更强的功能。因此通常在 J2EE 环境的 应用中,最好选择使用 ApplicationContext 下的子类。
 
Web 应用通过在 web.xml 中的配置(具体参见: web 应用中自动加载 ApplicationContext http://java999.blog.51cto.com/259217/196397 ),启动时会自动加载 ApplicationContext 实例。在 web 应用中虽然几乎所有被 BeanFactory 管理的用户代码都不需要知道 BeanFactory 但是在内部实现中, BeanFactory 还是以某种方式实例化。对于独立的引用程序或者一些 Servlet action jsp 可以使用以下的方法实例化 BeanFactory
    Resource resource = new FileSystemResource( "beans.xml" );
    BeanFactory factory = new XmlBeanFactory(resource);
 
    ClassPathResource resource = new ClassPathResource( "beans.xml" );
    BeanFactory factory = new XmlBeanFactory(resource);
 
    ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" , "applicationContext-part2.xml" });
    BeanFactory factory = (BeanFactory) context;