说说 BeanFactory和ApplicantContext?

可以这么形容,BeanFactory 是 Spring 的“心脏”,ApplicantContext 是完整的“身躯”。

spring-66328446-f89f-4b7a-8d9f-0e1145dd9b2f.png

  • BeanFactory(Bean 工厂)是 Spring 框架的基础设施,面向 Spring 本身。
  • ApplicantContext(应用上下文)建立在 BeanFactoty 基础上,面向使用 Spring 框架的开发者。

改写:

BeanFactory 接口

BeanFactory 是一个通用的工厂接口,用于创建和管理各种类的对象。

Spring提供了多种实现方式,其中最常用的是XmlBeanFactory。然而,在Spring 3.2中,XmlBeanFactory已被废弃,建议使用XmlBeanDefinitionReader和DefaultListableBeanFactory。

BeanFactory接口位于类结构树的顶端,其中最重要的方法是getBean(String var1),它从容器中返回指定名称的Bean。

通过其他接口,BeanFactory的功能得到了不断扩展。例如,AbstractAutowireCapableBeanFactory定义了按照某种规则(例如按名称匹配、按类型匹配等)自动装配容器中的Bean的方法。

下面是使用过时的XMLBeanFactory获取Bean的示例代码:

public class HelloWorldApp {
   public static void main(String[] args) {
      BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
      HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
      obj.getMessage();
   }
}
ApplicationContext 接口

ApplicationContext是从BeanFactory派生而来的,提供了更多面向实际应用的功能。可以将BeanFactory看作是手动挡,而将ApplicationContext看作是自动挡。

ApplicationContext继承了HierarchicalBeanFactory和ListableBeanFactory接口,并通过其他接口扩展了BeanFactory的功能,包括:

  • Bean的实例化和装配
  • 自动注册BeanPostProcessor
  • 自动注册BeanFactoryPostProcessor
  • 方便访问MessageSource(国际化)
  • 发布ApplicationEvent和预加载所有bean(与BeanFactory的延迟加载方式不同)

下面是使用ApplicationContext的示例代码:

public class HelloWorldApp {
   public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
      HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
      obj.getMessage();
   }
}

ApplicationContext包含了BeanFactory的所有特性,通常推荐使用ApplicationContext。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题