0


BeanFactory和ApplicationContext的区别

一、概述

BeanFactory与ApplicationContext的关系

  1. BeanFactory是Spring的早期接口,称为Spring的Bean工厂,ApplicationContext是后期更高级接口,称之为Spring容器
  2. ApplicationContext在BeanFactory基础上对功能进行了扩展,例如:监听功能、国际化功能等。BeanFactory的API更偏向底层ApplicationContext的API大多数是对这些底层API的封装
  3. Bean创建的主要逻辑和功能都被封装在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用,所以,ApplicationContext与BeanFactory既有继承关系,又有融合关系。
  4. Bean的初始化时机不同,原始BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext则是配置文件加载,容器一创建就将Bean都实例化并初始化好。

ApplicationContext除了继承了BeanFactory外,还继承了ApplicationEventPublisher(事件发布器)、
ResouresPatternResolver(资源解析器)、MessageSource(消息资源)等。但是ApplicationContext的核心功能还是BeanFactory。

在这里插入图片描述
BeanFactory与ApplicationContext的关系

在这里插入图片描述

applicationContext内部维护着beanFactory的引用,在学习过程中会查看beanFactory内部维护的属性,断点查看如下图示内容的:

BeanFactory是核心接口,项目运行过程中肯定有具体实现参与,这个具体实现就是

  1. DefaultListableBeanFactory

,而ApplicationContext内部维护的Beanfactory的实现类也是它。轮层级来说,真正可以作为一个可以独立使用的ioc容器还是

  1. DefaultListableBeanFactory

,因此可以这么说,

  1. DefaultListableBeanFactory

是整个spring ioc的始祖。

在这里插入图片描述

只导入spring-context坐标时,BeanFactory关系图如下:

在这里插入图片描述

只在Spring基础环境下,常用的三个ApplicationContext作用如下:

在这里插入图片描述

二、通过代码来验证加载

验证BeanFactory和ApplicationContext对Bean的初始化时机,

  1. ApplicationContext

  1. BeanFactory

区别我们可以通过

  1. classPathXmlApplicationContext

  1. XmlBeanFactory

来进行比较,

  1. classPathXmlApplicationContext

属于

  1. ApplicationContext

,而

  1. XmlBeanFactory

属于

  1. BeanFactory

系列的,

  1. XmlBeanFactory

继承自

  1. DefaultListableBeanFactory

,重写了一些功能,使自己更强大。

(1)添加依赖

  1. <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.23</version></dependency>

(2)添加TestController 和 TestService

  1. publicclassTestController{publicTestController(){System.out.println("TestController初始化了");}publicvoidmethod1(){System.out.println("method1");}publicvoidmethod2(){System.out.println("method2");}}
  1. publicclassTestService{publicTestService(){System.out.println("TestService初始化了");}publicvoidmethod1(){// 业务省略...}publicvoidmethod2(){// 业务省略...}}

(3)添加bean.xml

  1. <!-- 上面这一大堆是命名空间,也就是他提供了bean标签,spring需要根据这个来进行解析bean标签,如果没有他的话启动会报错 --><?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans
  2. http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- bean 标签:用于配置让 spring 创建对象,并且存入 ioc 容器之中
  3. id 属性:对象的唯一标识。spring内部将这些名称和具体的bean对象进行绑定,然后spring容器可以通过这个的名称找对我们需要的对象,这个名称叫做bean的名称
  4. class 属性:指定要创建对象的全限定类名
  5. --><beanid="testService"class="com.gzl.cn.service.TestService"/><beanid="testController"class="com.gzl.cn.controller.TestController"/></beans>
  1. publicclassClient{publicstaticvoidmain(String[] args){XmlBeanFactory xmlBeanFactory =newXmlBeanFactory(newClassPathResource("bean.xml"));}}

运行结果:并没有访问无参构造器初始化,当通过XmlBeanFactory 第一次访问getBean方法的时候才会触发初始化!

在这里插入图片描述

接下来再来看classPathXmlApplicationContext:

  1. publicclassClient{publicstaticvoidmain(String[] args){ClassPathXmlApplicationContext classPathXmlApplicationContext =newClassPathXmlApplicationContext("classpath:bean.xml");}}

运行结果:不管使用没使用都会触发初始化!

在这里插入图片描述

三、引入web依赖

如果Spring基础环境中加入了其他组件解决方案,如web层解决方案,即导入spring-web坐标,此时
ApplicationContext的继承体系:

  1. <dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.23</version></dependency>

在这里插入图片描述

在Spring的web环境下,常用的两个ApplicationContext作用如下:

在这里插入图片描述

web环境下的这两个ApplicationContext,在Spring集成web时使用。

标签: spring java

本文转载自: https://blog.csdn.net/weixin_43888891/article/details/127837712
版权归原作者 怪 咖@ 所有, 如有侵权,请联系我们删除。

“BeanFactory和ApplicationContext的区别”的评论:

还没有评论