# BeanFactory 与 ApplicationContext

  1. 什么是 BeanFactory

    • 它是 ApplicationContext 的父接口

    • 它是 Spring 的核心容器,主要的 ApplicationContext 实现都 “组合” 了它的功能

      image-20221128153459039

      可以看到,ConfigurableApplicationContext 继承 ApplicationContext, 而 ApplicationContext 又继承了 BeanFactory

  2. BeanFactory 能干什么

    • 表面上只有 getBean

    • 实际上控制反转,基本的依赖注入,直至 Bean 的生命周期的各种功能,都由它的实现类提供

      image-20221128154427849

  3. ApplicationContext 比 BeanFactory 多点啥

    • ApplicationContext 继承了 MessageSource 接口,用于实现国际化

      1
      2
      3
      System.out.println(context.getMessage("hi", null, Locale.CHINESE));
      System.out.println(context.getMessage("hi", null, Locale.ENGLISH));
      System.out.println(context.getMessage("hi", null, Locale.JAPANESE));

      image-20221128162537724

    • ApplicationContext 继承了 ResourcePatternResolver 接口,用于根据通配符实现资源的加载

      1
      2
      3
      4
      Resource[] resources = context.getResources("classpath*:/META-INF/spring.factories");
      for (Resource resource : resources) {
      System.out.println(resource);
      }
    • ApplicationContext 继承了 EnvironmentCapable, 用以获取环境变量和配置信息

      1
      2
      System.out.println(context.getEnvironment().getProperty("java_home"));
      System.out.println(context.getEnvironment().getProperty("server.port"));
    • ApplicationContext 继承了 ApplicationEventPublisher, 用以实现事件的发送

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      @Component
      public class Component2 {
      public static final Logger log = LoggerFactory.getLogger(Component2.class);
      @Autowired
      private ApplicationEventPublisher context;

      public void register() {
      System.out.println("我需要验证码!!! 现在发送订阅消息");
      context.publishEvent(new UserRegisteredEvent(this));
      System.out.println("ok了");
      }
      }


      @Component
      public class Component1 {
      public static final Logger log = LoggerFactory.getLogger(Component1.class);

      @EventListener
      public void aaa(UserRegisteredEvent event) {
      System.out.println("收到订阅消息, 立马发送验证码");
      }
      }