IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot面经 -> 正文阅读

[Java知识库]SpringBoot面经

SpringBoot面经


一、SpringBoot的自动装配原理??

  • BFPP: BeanFactoryPostProcessor
  • BPP: BeanPostProcessor
  • BDRPP: BeanDefinitionRegistryPostProcessor
步骤描述
Step11、当启动SpringBoot应用程序时,创建SpringApplication类对象,在对象的构造方法中会进行某些参数的初始化工作,最主要的是根据@Compoment注解标记好启动类以及初始化器和监听器。

在此过程中,会加载整个应用程序中的spring.factories文件,将文件内容放到缓存cache中,方便后续启动类注解解析时调用;
Step22、在SpringApplication对象创建完成之后,开始执行run()方法,来完成整个SpringBoot的启动。

启动过程中有两个核心方法;第一个叫做prepareContext(),第二个叫做refreshContext()SpringBoot在着两个关键步骤中完成了自动装配的核心功能,处理逻辑包含了上下文对象的创建,banner的打印,异常报告期的准备等前期准备工作,方便后续进行调用;
Step33、在prepareContext()方法中主要完成的是对上下文对象的初始化操作,包括属性值的设置,例如环境对象属性等。

在整个过程中有一个非常重要的方法,叫做load();它主要完成一件事,就是将当前启动类封装成一个BeanDefinition对象注册到registry中,方便后续进行BeanFactoryPostProcessor调用执行的时候,找到对应的主类,完成@SpringBootApplication@EnableAutoConfiguration等注解的解析工作;
Step44、在refreshContext()方法中会进行整个容器的刷新过程,底层实际上调用的是Spring中的refresh()方法,refresh中包含了13个关键方法,用于完成整个SpringBoot应用程序的启动。

在自动装配过程中,会调用invokeBeanFactoryPostProcessor()方法,此方法主要是对ConfigurationClassPostProcessor类的处理,它是BPP的子类,同时也是BDRPP的子类。

在执行时会先调用BDRPP中的postProcessBeanDefinitionRegistry()方法,然后调用postProcessBeanFactory()方法;在执行postProcessBeanDefinitionRegistry()方法的时候会解析处理各种注解,包括@PropertySource@ComponentScans@Bean@Import 等注解,最主要的还是@Import注解;
Step55、在解析 @Import注解 时,底层有一个 getImports() 方法,它会从主类开始递归的解析注解,把所有包含了@Import的注解都解析到,然后调用processImport()方法对Import的类进行分类。在解析@Import注解的过程中,主要识别的是AutoConfigurationImportSelect类,它属于ImportSelect的子类。

在后续过程中会调用deferredImportSelectHandler中的process()方法,来完成EnableAutoConfiguration的加载;
Step66、自动装配过程完成之后,我们自己导入的starter包以及META/INF文件下的spring.factories文件中EnableConfiguation中的配置类Bean对象,就会被注入到SpringContext容器中,由Spring容器进行管理。

二、SpringBoot的核心注解

在SpringBoot启动类上,有一个核心注解 @SpringBootApplication,它是三个注解的组合:

核心注解作用
@SpringBootConfiguration@SpringBootConfiguration 就是对 @Configuration 注解的封装,主要作用就是用来代替xml进行配置,其主要包括以下三个注解:

@Bean: 将配置对象交给Spring容器进行管理;
@ImportResource: 无法通过@Configuration方式配置的对象,可以通过此注解引入额外的xml配置;
@Import: 用于引入一个或者多个@Configuration修饰的配置文件类;
@ComponentScan@ComponentScan注解的作用就是开启组件扫描,可以自动扫描指定包路径下的 @Component 注解类并将Bean对象注册到context容器中;
@EnableAutoConfiguration
自动装配的核心注解
@EnableAutoConfiguration注解的主要作用就是提供 自动装配功能,注解的关键是AutoConfigurationImportSelector(自动配置文件收集器),用于收集配置文件中的配置工厂类,然后通过springfactories机制加载配置文件,具体就是从classpath类路径下,找到配置文件META-INF/spring.factories来配置加载AutoConfigure类,并根据注解@Conditional注解的条件进行去重与过滤,进行自动配置并将Bean注入到Spring Context中;

三、SpringBoot starter是什么?

1、概述

  • 使用Spring + SpringMVC框架进行开发的时候,如果需要引入mybatis框架,那么需要在xml中定义需要的bean对象,这个过程很明显是很麻烦的,如果需要引入额外的其他组件,那么也需要进行复杂的配置,因此在springboot中引入了starter;
  • starter就是一个jar包,写一个@Configuration的配置类,将这些bean定义在其中,然后再starter包的META-lNF/spring.factories中写入配置类,那么springboot程序在启动的时候就会按照约定来加载该配置类
  • 开发人员只需要将相应的startert包依赖进应用中,进行相关的属性配置,就可以进行代码开发,而不需要单独进行bean对象的配置,从而实现一站式开发

2、常用的starter

starter描述
spring-boot-starter核心 starter,包括自动化配置支持,日志以及 YAML
spring-boot-starter-aopSpring AOP 和 AspectJ 相关的切面编程 starter
spring-boot-starter-jdbc使用 HikariCP 连接池 JDBC 的 starter
spring-boot-starter-security使用 Spring Security 的 starter
spring-boot-starter-web构建 restful、springMVC 的 web应用程序的 starter
spring-boot-starter-freemarker静态页面化技术
spring-boot-starter-thymeleaf页面解析模板等
spring-boot-starter-redisredis的相关依赖
spring-boot-starter-elasticsearchES搜索引擎的相关依赖
spring-boot-starter-amqp消息队列MQ的相关依赖
mybatis-spring-boot-starter用于整合mybatis框架
mybatis-plus-boot-starter用于整合mybatis-plus框架
pagehelper-spring-boot-starter用于整合PageHelper处理Mybatis查询分页

三、SpringBoot 自动装配的方式

模式描述
no缺省情况下,自动配置通过ref属性手动指定,最常用的方式
byName根据bean的名称进行自动装配
btType按照指定数据类型自动装配,如果存在多个同类型对象,则会报错
constructor通过调用类的构造函数来注入依赖项
autodetect优先按照constructor模式装配,若找不到构造器,则根据btType模式装配
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:50:24  更:2022-08-19 18:51:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:05:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码