• 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的初始化时机,ApplicationContextBeanFactory区别我们可以通过classPathXmlApplicationContextXmlBeanFactory来进行比较,classPathXmlApplicationContext 属于ApplicationContext,而 XmlBeanFactory属于BeanFactory系列的,XmlBeanFactory继承自DefaultListableBeanFactory,重写了一些功能,使自己更强大。

    (1)添加依赖

    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-contextartifactId>
        <version>5.3.23version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (2)添加TestController 和 TestService

    public class TestController {
    
    	public TestController() {
            System.out.println("TestController初始化了");
        }
    
        public void method1(){
            System.out.println("method1");
        }
    
        public void method2(){
            System.out.println("method2");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    public class TestService {
    
    	public TestService() {
            System.out.println("TestService初始化了");
        }
     
        public void method1() {
            // 业务省略...
        }
    
        public void method2() {
            // 业务省略...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    (3)添加bean.xml

    
    
    <beans xmlns="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 id="testService" class="com.gzl.cn.service.TestService"/>
        <bean id="testController" class="com.gzl.cn.controller.TestController"/>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    public class Client {
        public static void main(String[] args) {
            XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(new ClassPathResource("bean.xml"));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    在这里插入图片描述

    接下来再来看classPathXmlApplicationContext:

    public class Client {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:bean.xml");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    在这里插入图片描述

    三、引入web依赖

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

    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-webartifactId>
        <version>5.3.23version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

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

    在这里插入图片描述

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

  • 相关阅读:
    Java 线程及线程池的创建方式
    猿创征文 |【C++】动态内存的分配与回收
    竞赛题-6241. 数组中不等三元组的数目
    汉威科技亮相2023上海传感器展,智能传感新品引关注
    cv2.dnn.NMSBoxes
    Go简单实现协程池
    综合能力 ---- 2. 法律法规
    【Flutter小记5】Isolate && ffi && Method Channel 使用简介与总结
    使用js搭建简易的WebRTC实现视频直播
    测试开发都这么厉害了?为啥不直接转业务开发?
  • 原文地址:https://blog.csdn.net/weixin_43888891/article/details/127837712