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是核心接口,项目运行过程中肯定有具体实现参与,这个具体实现就是

DefaultListableBeanFactory

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

DefaultListableBeanFactory

,因此可以这么说,

DefaultListableBeanFactory

是整个spring ioc的始祖。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

二、通过代码来验证加载

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

ApplicationContext

BeanFactory

区别我们可以通过

classPathXmlApplicationContext

XmlBeanFactory

来进行比较,

classPathXmlApplicationContext

属于

ApplicationContext

,而

XmlBeanFactory

属于

BeanFactory

系列的,

XmlBeanFactory

继承自

DefaultListableBeanFactory

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

(1)添加依赖

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

(2)添加TestController 和 TestService

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

(3)添加bean.xml

<!-- 上面这一大堆是命名空间,也就是他提供了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
    http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- bean 标签:用于配置让 spring 创建对象,并且存入 ioc 容器之中
        id 属性:对象的唯一标识。spring内部将这些名称和具体的bean对象进行绑定,然后spring容器可以通过这个的名称找对我们需要的对象,这个名称叫做bean的名称
        class 属性:指定要创建对象的全限定类名
    --><beanid="testService"class="com.gzl.cn.service.TestService"/><beanid="testController"class="com.gzl.cn.controller.TestController"/></beans>
publicclassClient{publicstaticvoidmain(String[] args){XmlBeanFactory xmlBeanFactory =newXmlBeanFactory(newClassPathResource("bean.xml"));}}

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

在这里插入图片描述

接下来再来看classPathXmlApplicationContext:

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

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

在这里插入图片描述

三、引入web依赖

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

<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的区别”的评论:

还没有评论