Spring中的工厂类ApplicationContext和BeanFactory

1.ApplicationContext

ApplicationContext的实现类,如下图

Spring中的工厂类ApplicationContext和BeanFactory_第1张图片

 

  • ClassPathXmlApplicationContext:加载类路径下 Spring 的配置文件

  • FileSystemXmlApplicationContext:加载本地磁盘下 Spring 的配置文件

ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置实现。

ApplicationContext:是IOC容器另一个重要接口, 它继承了BeanFactory的基本功能, 同时也继承了容器的高级功能,如:MessageSource(国际化资源接口)、ResourceLoader(资源加载接口)、ApplicationEventPublisher(应用事件发布接口)等。

基本代码:

  public static void main(String[] args) {
        // 创建ApplicationContext并加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

        // 获取Bean
        HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");

        // 使用Bean
        helloWorld.printMessage();
    }

2.BeanFactory

spring中工厂的类结构图:

Spring中的工厂类ApplicationContext和BeanFactory_第2张图片

BeanFactory 是Spring框架的最基本容器,它提供了一种延迟初始化Bean的机制。这意味着只有在需要时,Bean才会被实例化。BeanFactory 的主要职责是:

  • 加载Bean的配置信息。
  • 实例化Bean。
  • 维护Bean的生命周期。
  • 注入Bean之间的依赖关系。

基本代码:

 public static void main(String[] args) {
        // 创建BeanFactory并加载配置文件
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));

        // 获取Bean
        HelloWorld helloWorld = (HelloWorld) factory.getBean("helloWorld");

        // 使用Bean
        helloWorld.printMessage();
    }

 

3. 二者区别

  1. 延迟加载 vs. 预先加载: BeanFactory 采用延迟加载策略,只有在需要时才会实例化Bean。而 ApplicationContext 在容器启动时就会实例化所有的Bean。
  2. 功能扩展: ApplicationContext 提供了更多的企业级功能,如国际化、事件传播、资源加载等。它是BeanFactory 的一个扩展版本,适用于更复杂的应用程序。
  3. 性能: 由于 ApplicationContext 预先实例化所有的Bean,因此在启动时可能会有一些性能开销。相比之下,BeanFactory 的性能可能更好,因为它只在需要时才实例化Bean。
  4. 使用场景: 如果您的应用程序较小且对性能要求较高,可以使用BeanFactory。如果您需要更多的企业级功能或希望在启动时立即初始化Bean,可以使用ApplicationContext。

 代码展示:

        ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = ac.getBean("Service", UserService.class);
        System.out.println("Spring IOC容器创建好了");
        BeanFactory beanFactory1= new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
        beanFactory1.getBean("Service",UserService.class);
        System.out.println("第二个Spring IOC容器创建好了");
        BeanFactory beanFactory2= new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
        System.out.println("第三个Spring IOC容器创建好了");

Spring中的工厂类ApplicationContext和BeanFactory_第3张图片

你可能感兴趣的:(spring,java)