SpringBoot自动配置原理


SpringBoot 虽然干掉了 XML 但未做到 零配置,它体现出了一种 约定优于配置,也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。 一般情况下默认的配置足够满足日常开发所需,但在特殊的情况下,我们往往需要用到自定义属性配置、自定义文件配置、多环境配置、外部命令引导等一系列功能。不用担心,这些 SpringBoot 都替我们考虑好了,我们只需要遵循它的规则配置即可。

工作原理剖析

Spring Boot关于自动配置的源码在spring-boot-autoconfigure-x.x.x.x.jar中:
在这里插入图片描述
Spring Boot的启动类上有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解。那么自动配置原理一定和这个注解有着千丝万缕的联系!
在这里插入图片描述

@SpringBootApplication 是一个复合注解或派生注解,在@SpringBootApplication 中有一个注解@EnableAutoConfiguration ,翻译成人话就是开启自动配置,
在这里插入图片描述
@EnableAutoConfiguration是一个派生注解,其中的关键功能由@Import提供,其导入的AutoConfigurationImportSelector的 selectImports() 方法通过
SpringFactoriesLoader.loadFactoryNames() 扫描所有具有META-INF/spring.factories 的jar包。
在这里插入图片描述
这个 spring.factories 文件也是一组一组的key=value的形式,其中一个key是
EnableAutoConfiguration 类的全类名,而它的value是一个 xxxxAutoConfiguration 的类名的列表,这些类名以逗号分隔,如:
在这里插入图片描述
这个 @EnableAutoConfiguration 注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在 SpringApplication.run(…) 的内部就会执行 selectImports() 方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

自动配置生效原理

在 ServletWebServerFactoryAutoConfiguration 类上,有一个@EnableConfigurationProperties 注解:开启配置属性,而它后面的参数是一个ServerProperties类,这就是习惯优于配置(该做的帮你做好)的最终落地点。

总结

Spring Boot启动的时候类上有一个注解@SpringBootApplication,程序通过SpringApplication.run()将本类的字节码传递到这个类中,从通过反射机制加载这个注解。 @SpringBootApplication是一个派生注解,点击去发现 @EnableAutoConfiguration这就是开启自动配置的注解,通过这个注解找到@Improt 导入的注解找到 META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置
类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的,这样就完成了一个自动配置功能。
总结:

主配置类启动,通过@SringBootApplication 中的@EnableAutoConfguration 加载所需的所 有自动配置类,然后自动配置类生效并给容器添加各种组件。那么@EnableAutoConfguration 其实是通过它里面的@AutoConfigurationPackage 注解,将主配置类的所在包皮下面所有子包 里面的所有组件扫描加载到 Spring 容器中; 还通过@EnableAutoConfguration 里面的 AutoConfigurationImportSelector 选择器中的SringFactoriesLoader.loadFactoryNames()方法,获取类路径下的 META-INF/spring.factories 中的 资源并经过一些列判断之后作为自动配置类生效到容器中,自动配置类生效后帮我们进行自 动配置工作,就会给容器中添加各种组件:这些组件的属性是从对应的 Properties 类中获取 的,这些 Properties 类里面的属性又是通过@ConfigurationProperties 和配置文件绑定的:所以 我们能配置的属性也都是来源于这个功能的 Properties 类。SpringBoot 在自动配置很多组件 的时候,先判断容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置 的,如果没有,才自动配置;如果有些组件可以有多个就将用户配置和默认配置的组合起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值