自从开始学习springboot后,我发现,springmvc的配置文件不用自己配了,web.xml不用自己配了,很多的依赖都不用自己导入了,只需要引入相关的的starter(启动器)就够了。那为什么这些都不用自己配置了呢,是因为springboot有自动装配的功能。但是为什么springboot可以自动装配了,本着探索的精神,我决定去看看那有点让人头疼的源码。。。
以下是我在看完源码后得出的个人理解,如有错误,请多指正,不胜感激!
首先这是springboot的主配置类,里面主要是一个@SpringBootApplication注解和run()方法。
点开@SpringBootApplication注解,可以发现这是一个组合注解:
@ComponentScan:组件扫描的注解
点开@SpringBootConfiguration注解,发现它是一个@Configuration配置类,点开它
发现它是spring的组件
综上,可以看出主类HelloworldApplication是一个配置类,并且作为一个组件交给spring管理
然后,点击@EnableAutoConfiguration注解,顾名思义,这是springboot自动装配的实现方式
这里面主要是两个注解,@AutoConfigurationPackage和@import(AutoConfigurationimportSelector.class)
@AutoConfigurationPackage是自动配置包的注解,点开发现是一个@import注解
点击Registrar,可以发现这个静态内部类是可以得到包名的,这就是@AutoConfigurationPackage注解实现自动配置包获得到的包名
然后观察@import注解,点击AutoConfigurationimportSelector这个自动配置导入的选择器,
可以看见selectimports()方法,并通过getCandidateConfigurations()方法得到需要自动配置的属性
在这个getCandidateConfigurations()方法,已经能看见springboot是从meta-INF/spring.factories获取自动装配的属性的
而这个spring.factories的位置在Maven:org.springframwork.boot:spring-boot-test-autoconfigue这个程序包下
点进去可以看见有很多可以自动配置的属性,而这些属性的大部分不是默认导入的,当在pom里面导入相关的启动器,springboot就会自动配置需要的属性(有默认值),而这些默认值也是可以在application.yaml中进行更改的。
例:点进DataSourceAutoConfiguration
可以发现它绑定了一个DataSourceProperties的class
而在这个properties类中的属性都是可以在yaml文件中配置的,比如下图中的l连接数据库的参数driverClassName,url,username,password
结论 springboot所有自动配置都是在启动的时候扫描并加载: spring.factories,所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功。
所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功。



