SpringBoot———自动装配原理
- spring支持两种bean的配置方式:基于xml文件和JavaConfig
主启动类上的注解@SpringBootApplication
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210714162836559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NjczMzY3,size_16,color_FFFFFF,t_70#pic_center)
@SpringBootApplication里有三个重要注解
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/7c7462cdaa8563a72e726ddd30a5f3d6.png)
@SpringBootConfiguration
作用: 声明定义Bean,嵌套了@Component组件
1.@SpringBootConfiguration源码是@Configuration:表示该类为主配置类,可用来装配bean
2.@Configuration的源码是@Component:说明Spring的配置类也是Spring的一个组件。
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/887de224e8925ed0094e205acae8d268.png)
- 它是JavaConfig形式的基于Spring IOC容器的配置类使用的一种注解。SpringBoot本质上就是一个Spring应用,通过这个注解来加载IOC容器的配置。所以在启动类里面标注了==@Configuration==,意味着它也是一个IOC容器的配置类
@ComponentScan
- 作用:扫描主配置类包的所有包下的类,相当于xml配置文件中的context:component-scan。eg:pojo中的User类
@EnableAutoConfiguration(重点!!!)
@EnableAutoConfiguration里有两个重要注解
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210714165849597.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NjczMzY3,size_16,color_FFFFFF,t_70#pic_center)
-
@AutoConfigurationPackage:自动配置包
- 作用:给Spring容器中导入一个Registrar注册器组件
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ed8e82188246c216ba8b6975c987c6b7.png)
@AutoConfigurationPackage和@ComponentScan一样,也是将主配置类所在的包及其子包里面的组件扫描到IOC容器中,但是区别是
@AutoConfigurationPackage扫描@Enitity、@MapperScan等第三方依赖的注解
@ComponentScan只扫描@Controller/@Service/@Component/@Repository这些常见注解。所以这两个注解扫描的对象是不一样的。
2.@Import(AutoConfigurationImportSelector.class)——核心注解
作用:通过import导入第三方提供的bean的配置类:AutoConfigurationImportSelector:给容器中导入组件
该类中有selectImports()方法,调用了getAutoConfigurationEntry()
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/70695467dc0278e958931fb13edd9541.png)
其下又调用了getCandidateConfigurations()
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/f4a5c67486ace47f16245245fb0bb7de.png)
getCandidateConfigurations()中SpringFactoriesLoader.loadFactoryNames()方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/754862599977721b1bffcfb9e0ef40e0.png)
SpringFactoriesLoader.loadFactoryNames()中传入参数EnableAutoConfiguration.class
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ef6016fcc4c38ff9666d1c66297e0fdd.png)
作用:扫描所有jar包类路径下的META-INF/spring.factories文件,将扫描到的这些文件包装成properties对象,从properties中获取到EnableAutoConfiguration.class类名对应的值,将这些值添加到容器中,用这些类做自动配置功能
在spring-boot-autoconfigure-.jar包中找到spring.factories文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/bd9242739f1468833292c3d47cea82ae.png)
其中spring.factories文件是一组组的key=value的形式
-
- key=接口 value=接口实现类(多个,逗号隔开)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210715132742752.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NjczMzY3,size_16,color_FFFFFF,t_70#pic_center)
以HttpEncodingAutoConfiguration为例解释:
@Configuration(proxyBeanMethods = false)————表示该类为配置类
@EnableConfigurationProperties(ServerProperties.class)————将配置文件中设置的值与properties中的属性绑定,将组件添加到IOC容器
————@Conditionalxxx:若满足不同的条件,则配置类中的配置生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = “server.servlet.encoding”, value = “enabled”, matchIfMissing = true)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/22d69fd467fc55371bfc024e45e9b57e.png)
其中ServerProperties.class中的属性值,可与xx.yaml配置文件绑定并修改
精髓:根据当前配置类的条件判断配置类是否生效,若生效,则添加各种组件,会从properties类中获取属性,可以在配置文件xxx.yaml中设置属性的值
Properties类:封装配置文件的相关属性。
AutoConfiguration类:自动配置类,添加到IOC容器中。
SpringFactoriesLoader
作用:从classpath/META-INF/spring.factories文件中,根据key来加载对应的类到spring IOC容器中。
自动装配过程
通过各种注解实现了类与类之间的依赖关系,容器在启动的时候SpringApplication.run(),调用EnableAutoConfigurationImportSelector.class的selectImports方法
selectImports方法调用SpringFactoriesLoader.loadFactoryNames方法扫描jar包类路径下的META-INF/spring.factories文件下,获取BeanConfiguration列表
loadFactoryNames方法会读取spring.factories中EnableAutoConfiguration.class类名对应的值
根据这些类上的注解判断,若条件满足,则该配置类生效,将配置文件中自己设置的属性值配置到对应的配置类中,最后注入到IOC容器中实现自动配置
总结
n.class类名对应的值
根据这些类上的注解判断,若条件满足,则该配置类生效,将配置文件中自己设置的属性值配置到对应的配置类中,最后注入到IOC容器中实现自动配置
总结
SpringBoot启动的时候通过@EnableAutoConfiguration注解找到META-INF/spring.factories文件中的所有自动配置类,并对其加载,这些自动配置类都是以AutoConfiguration结尾来命名的。它实际上就是一个JavaConfig形式的IOC容器配置类,通过以Properties结尾命名的类中取得在全局配置文件中配置的属性,如server.port。