开发者学堂课程【SpringBoot 实战教程: SpringBoot 自动配置的原理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/651/detail/10777
SpringBoot 自动配置的原理
1、既然 springboot 可以根据 pom 中依赖的 jar 包进行自动配置,那说明在项目启动时已经进行了配置,而项目启动的入口,就是 main 方法,使用的是 springapplication.run 方法进行启动,源码在 springapplication 里面找。
2、当项目启动时它首先执行的初始化方法叫 initialize,这个方法里面调用 setinitializers,这个方法里面调用了 getspringfactoriesinstances,这个方法调用 loadfactorynames,( FACTORIES RESOURCE LOCATION) 这是符号常量,在当前类中找一下,它代表的是"META- INF/spring. Factories
",找一下这个文件,在依赖下,这个是 spring 自动配置的 jar 包,有个 meta-inf,下面有一个 spring. Factories。也就是首先它加载 META- INF/spring. Factories 这个文件。
3、spring. Factories 这个文件里面又很多auto configiuration 自动配置,boot configiuration 包名,autoconfigiurationimportfilter 类名,后面是\。有 aop 的,都是实现自动配置所实现的包和类名,再比如 redis.redisautoconfigiuration,它去读取文件,就知道每一个需要自动配置所对应配置类的包和类名,再看源码,它加载 getsystemreources 文件,实际上对每一个进行实例化 createspringfactoriesinstances
也就是它要根据配置文件中的类进行实例化,因为它要自动配置,这里是每一项对应的自动配置的 class,所以它要找到这些配置进行实例化。
4、比如程序里面整合 redis,springboot 要对 redis 进行自动配置,找到包,再找 到 class,把这个 class 进行实例化,就是创建对象。
5、它用了一个注解叫 @conditionlonclass,需要满足在当前环境下存在 jedisconnection.class 和 redisoperations.class 以及 jedis.class 三个类才会对 redisautoconfiguration 的 class 进行实例化,实例化的同时就可以进行自动化的配置。需要指定端口号,在哪个数据库里存,这里面有一个成员 redisproperties。这里面就是 redis 的默认配置,有哪个数据存到数据库里面,url 和 host,有的是有默认值,连接 redis 的密码,连接 redis 的端口号,默认是6379。
6、如果没有在 application 全局配置文件中进行配置,redis 采用的都是默认配置,ConfigurationProperties 是类型安全的配置,如果在 application 全局配置中配置了,它就会在全局配置文件中读取以 spring.redis 开头的,就把自定义配置覆盖默认配置,否则用的就是默认的配置,这个就是 springboot 自动配置的原理,就是它读取 spring.factories 文件,根据文件找到这些类进行实例化,根据类中的属性默认使用的都有默认值。