SpringBoot 面试题+答案

1.SpringBoot的自动装配原理

主要文件:spring.factories
关键类:BeanPostProcessor(AOP在这个类实现) 和BeanFactoryPostProcessor(自动装配在这实现)
实现的方法名称(准备上下文):prepareContext(监听配置、设置环境对象、进行初始化操作、load对应的资源)
prepareContext方法之前的操作豆角准备工作(事件发布)

是在BeanFactoryPostProcessor里面处理的,是要判断一系列的注解或者标签,最终我们解析到import的时候,可以取到AutoConfigurationImportSelector

EnableAutoConfiguration类去加载spring.factory文件

2.SpringBoot启动流程

1.new SpringApplication():去spring.factory里面查找我们的初始化器,再去里面查找我们的监听器,还有些其他操作,选择我们应用的sevlet的类型。
2.调用run方法:使是我们Spring的核心流程,prepareContext之前的操作都是在为spring做准备工作
3.调用prepareContext方法:准备上下文(监听配置、设置环境对象、进行初始化操作、load对应的资源)在整个自动装配中,做了加载启动类,把启动类注入容器中。
4.refreshContext:->refresh方法:是启动的核心步骤。(1.创建工厂,2拿取配置信息,3.执行BeanFactoryPostProcessor处理类(方法名称是invokeBeanFactoryPostProcessors()),4.注册BeanPostPeocessor(方法名称是registerBeanPostProcessor())5,初始化消息配置(国际化配置),6.初始化事件广播器,7.注册监听器(方法名称registerListenrs(),8.开始进行所有单例对象实例化的环节(方法名称:finshBeanfactoryInitialization()),9.完成刷新(finshRefresh))

启动流程:
首先分为四大模块:

  1. 服务构建
    New SpringApplication()构造方法里面
    把传入的资源加载器和主方法类加载到内存中。
    设置确认web应用的服务类型、设置初始化器(七个)、设置事件监听器(8个)、加载启动类

  2. 环境准备
    调用run方法进入环境准备阶段

    1. 创建bootstrapContext(启动上下文)
    2. 启动运行监听器(SpringApplicationRunnerListeners),同时发布启动事件,相当于开启我们之前加载的8个Listener,然后就可以接受相对应的事件了。
    3. 组装环境参数(通过prepareEnvironment方法)。所谓的环境参数就是系统环境变量和JVM系统属性。然后发布环境准备完成事件,对应的8个Listener会监听到这个事件(通过观察者模式,逐一串行),会等待所有的监听器都处理完成后再继续执行,最后打印banner图。
  3. 容器创建

    1. 就是传说中的ApplicationContext的创建。通过createApplicationContext来创建容器(里面包含了创建BeanFactory和创建后处理器“是用来解析注解的处理器”,创建好后就放到容器)。
    2. 部分属性初始化(调用prepareContext方法),里面包括了设置资源加载器、执行七个初始化器、发布容器准备完成事件、调用load方法,把启动类的资源bean加载到定义池中。最后发布资源加载完成事件。到此容器就创建完成了。
  4. 属性填充

    1. 创建bean,放到容器当中(调用方法refreshContext,里面包含了12个小步骤,包括自动装备,启动tomcat服务器,和bean的生命周期)
    2. 发布启动完成事件,同时回调自定义实现的Runner接口。

自动装配:AutoConfigurationImportSelecter类
refresh方法:是启动的核心步骤。(1.重新构造beanFactory工厂,2拿取和检验配置信息,3.执行BeanFactoryPostProcessor处理类(方法名称是invokeBeanFactoryPostProcessors()),4.注册BeanPostPeocessor(方法名称是registerBeanPostProcessor())5,初始化消息配置(国际化配置),6.初始化事件广播器,7.注册监听器(方法名称registerListenrs(),8.开始进行所有单例对象实例化的环节(方法名称:finshBeanfactoryInitialization()),9.完成刷新(finshRefresh))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值