首页 > 编程语言 >Java SPI与SpringBoot 自动配置

Java SPI与SpringBoot 自动配置

时间:2022-08-30 11:25:12浏览次数:53  
标签:Java SpringBoot 配置文件 spring 配置 SPI 自动 IOC

Java SPI设计思想

1、使用约定的配置文件

2、谁提供jar包,也要负责提供配置文件

3、使用ClassLoader的getResource和getResources方法,来读取classpath中的配置文件

 

SpringBoot自动配置核心实现

1、使用约定的配置文件:

1.1 文件路径是META-INF/spring.factories

1.2 文件内容是“key=value1,value2...valueN”的格式

其中key是 EnableAutoConfiguration的类名,value是自动配置类的类名

2、提供自动配置类的jar包,也同时提供配置文件MATA-INF/spring.factories

3、和SPI一样:使用ClassLoader的getResources和getResources方法来读取classPath中的配置文件。

 

SpringBoot自动配置的核心流程:

1、SpringBoot应用程序启动->通过Spring Factories机制加载配置文件->筛选出所有自动配置类->将这些类注入到SpringIOC容器中

机制:通过ClassLoader去获取classpath中的配置文件META-INF/spring.factories。 springFacotries是Spring框架内置的,是spring框架对外扩展的入口,很多地方都要用到。

筛选:在所有配置文件中META-INF/spring.facotries中,筛选出以EnableAutoConfiguration为key的配置值。

 

SpringBoot自动配置

启动流程伪代码:

1、创建一个ApplicationContext实例,即我们的IOC容器

ApplicationContext context=createApplicationContext();

2、将主类 mainClass 注册到IOC容器中

loadSourceClass(context,mainclass)

3、递归加载处理所有配置类

processConfigurationClasses(context)

4、实例化所有的单例bean(Singleton Bean),"依赖注入”和“自动装配”

instantiateSingletonBeans(context)

5、如果是web应用则启动web服务器(tomcat)

startWebServer(context);

 

 

1.1 首先从IOC容器中取出当前存在的源配置类

2.2 创建一个配置类解析器,然后递归加载并处理应用中的所有配置类

3.1 向IOC容器中注册@Bean方法对应的BeanDefinition

3.2 向IOC容器中注册ImportBeanDefinitionRegister导入BeanDefinition

 

加载配置类的流程:

1、处理@ComponentScan:根据@ComponentScan扫描指定的package,得到一系列配置类

2、处理注解@Import:根据注解Import,得到一系列被导入的配置类

3、处理@Bean方法

4、处理@Import导入的ImportBeanDefinitionRegistar

5、加入到一个全局的配置类集合中

notice:源配置类,通过ComponentScan、@Scan、@Import依次递归遍历注册bean到IOC容器中

 

 

导入ImportSelector选择器实现自动配置

@SpringBootApplication->@EnableAutoConfiguration->@Import(AutoConfigurationImportSelector.class)->AutoConfigurationImportSelect继承了ImportSelector接口->getAutoConfigurationEntry()->

去Spring.factories下面去加载配置类

 

 

  

标签:Java,SpringBoot,配置文件,spring,配置,SPI,自动,IOC
From: https://www.cnblogs.com/Alei777/p/16638430.html

相关文章

  • 除了Guava,Java开发者还值得了解的5个谷歌类库
    Guava是谷歌基于Java1.6的一个类库集合的扩展项目,包含了许多谷歌核心的Java常用库。除开Guava,还有一些谷歌的常用Java类库也值得我们关注,本文列出了其中的五个类库......
  • Java正确比较浮点数的方法
    https://www.jb51.net/article/199220.htm 看下面这段代码,将d1和d2两个浮点数进行比较,输出的结果会是什么?123doubled1=.1*3;doubled2=.3;......
  • 降低Java垃圾回收开销的5条建议
    保持GC低开销的窍门有哪些?随着一再拖延而即将发布的Java9,G1(“GarbageFirst”)垃圾回收器将被成为HotSpot虚拟机默认的垃圾回收器。从serial垃圾回收器到C......
  • java枚举
    ......
  • 如何在springBoot中进行ReactiveFeignClient超时配置
    最近项目中用到了ReactiveFeign请求第三方的http接口,需要自定义一个请求超时时间,但在网上查了很多资料都没有一个比较准确的配置方法。pom依赖<dependency><groupId>......
  • springboot加载静态资源
      第一步写一个config的类继承,WebMvcConfigurationSupport   重写这个方法/**是指这个后面的路径都可以加载另一个配置类加载web:resources:static-lo......
  • Java中Thread类的常用API以及使用示例
    场景Java语言是支持多线程的,一个正在运行的Java程序可以称之为一个进程(process),在每个进程里面包含多个线程,线程是进程中单一的顺序控制流,CPU在执行计算机指令的时候都是......
  • B/S端界面控件DevExtreme JavaScript—全新的UI模板库 (v22.2)
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能......
  • java计算代码段执行时间
    java里计算代码段执行时间可以有两种方法,一种是毫秒级别的计算,另一种是更精确的纳秒级别的计算。一)毫秒级别计算时间longstartTime=System.currentTimeMillis();/*......
  • Java 学生管理系统
    今天简单练习了一下数组和循环的一些知识,写了一个小游戏,大致如下/***一个小功能:学生管理系统*1、添加学生信息*2、显示学生信息*3、删除学生信息*4、修......