赞
踩
这篇博客参考自 JavaGuide的公众号,详细信息可以去关注他的公众号来查看
前提背景:
首先我们需要知道的是,对于Spring-Boot项目,只需要添加相关依赖,无需配置,通过启动main方法就行,并且可以对全局变量文件application.properties或application.yml即可对项目进行设置,比如更换端口号,配置jpa属性等等
其次,要知道SpringBoot定义了一套接口规范:SpringBoot在启动的时候会扫描外部引用jar包中的META-INF/spring.factories文件,将文件中的配置类型信息加载到Spring容器,并执行类定义中的各项操作,所以对于外部的jar来说,只需要安装spring定义的标准,就能把自己的功能装置到springBoot中。
正文
随便创建一个Spring-Boot项目
1.核心注释SpringBootApplication
可以把@SpringBootApplication看作是@SpringBootConfiguration,@EnableAutoConfiguration和
@ComponentScan这个三个注解的集合,而其中这三个注解的作用分别是:
@SpringBootConfiguration:允许在上下文中注册额外的bean或者导入其他配置项
@EnableAutoConfiguration 启动SpringBooot的自动配置机制 @ComponentScan
扫描被@Compent(@Service
@Controller)注解的bean,注解是会默认扫描启动类所在的包下的所有的类,也可以自定义不扫描一些bean
所以会发现是@EnableAutoConfiguration这个注解的功劳
2.@EnableAutoConfiguration
去看这个代码
会发现它只是一个简单的注解,自动装配核心功能的实现实际上是通过AutoConfigurationImportSelector来实现的,所以再看一下这个类
3.AutoConfigurationImportSelector类
再根据
锁定到了最后一个,也就是说AutoConfigurationImportSelector类是实现了ImportSelector接口,也实现了接口中的selectImports方法,这个方法的作用就是:获取所有的符合条件的全限定类名,这些类需要被加载到IOC容器当中
在关注一下getAutoConfigurationEntry这个方法,这个方法是主要负责加载自动配置类的。
这个是调用链
对应源码如下:
设置记号进行debug
第一步:到isEnabled这个函数
先判断自动装配的开关是否打开,发现EnableAutoConfiguration默认是true的,这个是可以再application.properties或application.yml中设置
第二步就是,获取EnableAutoConfiguration中的exclude和excludeName
第三步就是获取需要自动装配的所有配置类,读取META-INF/spring.factories
这个可以和Maven那边的org.springframework.boot:spring-boot_autoconfiguration那边对比一下
从下图可以看到是都被读取到的,所以这个的作用就是按需加载组件
而且不光是这个依赖下的META-INF/spring.factories被读取到,所有 Spring Boot Starter 下的META-INF/spring.factories都会被读取到
并且,由于这里的明显变小可以知道(调用了这个方法getConfigurationClassFilter)
经过这一步的筛选,那些满足条件的类才会生效
总的来说就是
Spring Boot 通过@EnableAutoConfiguration开启自动装配,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类,想要其生效必须引入spring-boot-starter-xxx包实现起步依赖
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。