Spring (9)ApplicationContext和BeanFactory区别

发布于:2024-05-21 ⋅ 阅读:(136) ⋅ 点赞:(0)

ApplicationContextBeanFactory是Spring框架中用于提供Bean管理和访问的两个核心接口。虽然它们在功能上有所重叠,但也存在一些关键的区别。理解这些区别有助于在不同的场景下选择合适的类型来使用。

基本区别

  • 启动时的加载差异:

    • BeanFactory采用的是懒加载形式,即只有在请求获取Bean时才会创建该Bean。
    • ApplicationContext则在启动时就实例化所有单例Bean。这意味着ApplicationContext会有更快的响应速度,因为所有的Bean在应用启动时就已经准备好了,但这也会增加应用启动的时间和初始内存消耗。
  • 功能丰富性:

    • ApplicationContext提供了比BeanFactory更多的企业级功能,如更方便的国际化支持、事件传播、不同应用层的上下文实现(如Web应用中的WebApplicationContext)等。
    • BeanFactory相对来说更加轻量级,主要提供了Bean的创建和管理功能。

源码角度分析

在Spring的源码中,ApplicationContext是建立在BeanFactory基础之上的,它扩展了BeanFactory的功能。

  • BeanFactory接口:
    BeanFactory是一个顶级接口,定义了获取Bean、判断Bean是否存在等基本操作。

    public interface BeanFactory {
        Object getBean(String name) throws BeansException;
        <T> T getBean(String name, Class<T> requiredType) throws BeansException;
        // 更多方法...
    }
    
  • ApplicationContext接口:
    ApplicationContext继承自ListableBeanFactoryHierarchicalBeanFactoryMessageSourceApplicationEventPublisher等多个接口,提供了更为丰富的功能。

    public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
            MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
        // 定义了ApplicationContext特有的方法
    }
    

代码演示

  • 使用BeanFactory:

    BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
    MyBean myBean = (MyBean) factory.getBean("myBean");
    System.out.println(myBean.getMessage());
    
  • 使用ApplicationContext:

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    MyBean myBean = context.getBean("myBean", MyBean.class);
    System.out.println(myBean.getMessage());
    

总结

虽然ApplicationContextBeanFactory都可以用于Bean的管理和访问,但ApplicationContext提供了更为丰富的功能和更好的集成支持。在大多数实际应用场景中,推荐使用ApplicationContext,因为它提供了更完整的Spring功能支持。BeanFactory可以在资源较为紧张的场景下使用,或者当你需要更细粒度的控制Bean加载过程时考虑使用。