springboot3自动装配机制原理(小白也看得懂)

@springbootApplication注解

springboot3自动装配机制原理(小白也看得懂)_第1张图片

实现自动装配的核心就是@EnableAutoConfiguration。(springboot就是通过此注解实现自动装配机制,主要作用就是让springboot去扫描默认的配置类,如果没有这个类的话,springboot只会默认扫描启动类下包中各个类的注解)

springboot3自动装配机制原理(小白也看得懂)_第2张图片

 @Import注解的作用就是将对应的类配置到ioc容器中,这里就是AutoConfigurationImportSelector类配置到ioc容器中。

AutoConfigurationImportSelector类

这个类的作用就是自动配置类选择器。

springboot3自动装配机制原理(小白也看得懂)_第3张图片 该配置类会通过此方法getAutoConfigurationEntry获取获取要自动配置的类。(此时就扫描了这146个默认配置类)

springboot3自动装配机制原理(小白也看得懂)_第4张图片 启动进行DEBUG,可以看到有146个自动装配类,在断点处会执行getCandidateConfigurations方法。

springboot3自动装配机制原理(小白也看得懂)_第5张图片

在这些扫描到的默认配置类中只要有@AutoConfiguration注解并且没有对应的导入限制,就进行自动装配。 (在默认的配置类范围内识别)

导入不成功例子:

springboot3自动装配机制原理(小白也看得懂)_第6张图片

在此配置类中还需要ioc容器中存在相应的类才能执行自动装配,所以146个配置类并表示都进行配置的。 

默认的配置类范围内在

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports.

springboot3自动装配机制原理(小白也看得懂)_第7张图片 总共默认自动装配的类有146个xxxxAutoConfiguration配置类springboot3自动装配机制原理(小白也看得懂)_第8张图片

自动配置类与application.yml绑定原理

 例子:平时我们想要改tomcat的端口号时只需要在application.yml中修改就可以生效,分析源码。

在ServletWebServerFactoryAutoConfiguration配置类中有:

 @EnableConfigurationProperties(ServerProperties.class) 

就是将外部引入的serverProperties类配置到ioc容器中。

springboot3自动装配机制原理(小白也看得懂)_第9张图片

 ServerProperties类使用@ConfigurationProperties注解将applicatinon.yml中以server为前缀的配置信息赋给ServerProperties类。(此时此类就有port的值,也就是端口号的值)

springboot3自动装配机制原理(小白也看得懂)_第10张图片

 在返回servletweb工厂中,也就是ServletWebServerFactoryCustomizer

springboot3自动装配机制原理(小白也看得懂)_第11张图片

 在ServletWebServerFactoryCustomizer类中,因为传入了serverProperties类,最终就可以获取在application.yml中配置的端口号,实现tomcat的端口号更改。

springboot3自动装配机制原理(小白也看得懂)_第12张图片

其他的配置类和application.yml的属性绑定的步骤和此处的步骤一致。

总流程图 

springboot3自动装配机制原理(小白也看得懂)_第13张图片

核心流程总结:

1、导入starter,就会导入autoconfigure包。

2、autoconfigure 包里面 有一个文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定的所有启动要加载的自动配置类

3、@EnableAutoConfiguration 会自动的把上面文件里面写的所有自动配置类都导入进来。xxxAutoConfiguration 是有条件注解进行按需加载

4、xxxAutoConfiguration给容器中导入一堆组件,组件都是从 xxxProperties中提取属性值

5、xxxProperties又是和配置文件进行了绑定

效果:导入starter、修改配置文件,就能修改底层行为。

你可能感兴趣的:(Spring,SpringBoot,spring,java,后端)