spring boot 自动装配为那般
熊大
spring boot作为目前最火的web框架其中最令人津津乐道的便是自动装配只需在配置文件中按照一定的格式配置就能自动连接减少许多不必要的工作。 那它究竟是如何实现自动装配呢?
古语云:工欲善其事必先利其器在了解自动装配之前先做一些准备工作。 先简单看下一些注解的含义
| 注解 | 作用 |
|---|---|
| @Component | 基础注解(元注解)可被嵌套 |
| @Configuration | 声明定义Bean,嵌套了@Component |
| @Import | 导入具体类 |
| @ConditionalOnClass | 类存在时装配 |
| @ConfigurationProperties | 读取配置文件中的属性 |
上面提到了嵌套注解顾名思义就是一个注解上标注了其他注解如@Service

由上图可知@Service注解里面嵌套了@Component注解。从而是它拥有了@Component注解得能力这个就类似继承子类拥有父类的能力。不光@Service注解嵌套了@Component, @Controller也是如此。
spring
对外提供了一些接口方便我们扩展如:BeanFactoryPostProcessor、BeanPostProcessor、ImportSeylector等接口
我们重点了解下ImportSeylector 他是spring提供一个批量加载把bean导入ioc的接口。
首先我们看下SpringBootApplication注解他是否是嵌套得注解:
如图所示:
@SpringBootApplication由三个注解组合而成其中
@SpringBootConfiguration嵌套了@Configuration这标明这是一个配置类
@EnableAutoConfiguration则是由@AutoConfigurationPackage,@Import注解构成。
也就是说@SpringBootApplication注解是由多个注解组合而成底层嵌套了一些spring
提供得注解以便spring在启动得时候能够对@SpringBootApplication注解进行处理。
看下@Import注解导入了那个类具体对spring那个接口进行了扩展

由上面类图可以看到最后都集中到了AutoConfigurationImportSelector这个类上。那么我们先看下selectImports
这个方法具体实现autoconfigurationimportselector.selectimports.png 方法调用关系图如下:

那看下loadFactoryNames都干了什么?
请看源码标红得地方:他是读取了"META-INF/spring.factories" 然后解析处理返回了list
打开这个spring.factories看看究竟是什么东西

我们发现这里有好多类比较眼熟mysql、redis、rabbitmq,mongodb,es就拿DataSourceAutoConfiguration看下他又是什么东东

此处可以看出DataSourceAutoConfiguration上标注了多个注解我们这里只关注*@EnableConfigurationProperties*这个注解里面得class。

当看到==ConfigurationProperties(prefix=“spring.datasource”)==是不是非常眼熟呢?这个不就是我们配置文件配置的属性嘛?当然如果你想你的配置生效还需要在pom文件中加上相对应得starter。如果没有添加他不会去加载得。源码中是有过滤得这也符合我们得预期需要得加载不需要得不用。
其实到这里spring boot自动装配得神秘面纱已经揭开了:
- @SpringBootApplication是一个组合注解它利用spring 提供得基础注解做扩展。利用@Import导入自定义得bean
这个bean则实现了spring 得接口进行自定义扩展导入到ioc容器中。
备注:
文中使用了大量得图片所以对一些源码进行了删减保留了重要得方法。
最好看完之后在idea中跟着源码点下这样更加清晰。

本文围绕Spring Boot自动装配展开,先介绍了相关注解含义,如嵌套注解@Service嵌套@Component。还提及Spring提供的扩展接口,重点讲解ImportSeylector。通过分析@SpringBootApplication注解,揭示其组合构成及底层嵌套注解。最后指出自动装配是利用基础注解扩展,导入自定义bean到IOC容器。
637

被折叠的 条评论
为什么被折叠?



