学习记录:SpringBootApplication注解
SpringBootApplication注解
1.点开SpringBootApplication注解,很容易发现,上面一共有七个注解,其中四个是原注解,其余三个是和自动配置的注解,四个原注解这里就不多解释了,不懂的可以百度Java原注解相关知识
2.大致说下三个注解的用途
1.SpringBootConfiguration注解,表示这是一个配置类
2.SpringBootConfiguration注解,起到自动装配作用
3.ComponentScan注解,扫包
SpringBootConfiguration注解
点开SpringBootConfiguration注解,发现上面有四个注解,其中三个是原注解,只有一个Configuration注解是业务相关的注解,这个注解就好理解了,表示这是一个配置类,SpringBootConfiguration和Configuration起到相同的作用,SpringBootConfiguration是Spring Boot特意封装的一个注解
ComponentScan注解
这个注解没什么好说的,就是起到扫包的作用,Spring Boot1.x版本,只会扫启动类的子孙包下的所有注解,2.x版本会扫启动类以及子孙包下的所有版本,但是一般没有人把类建在和启动类平级的目录下
SpringBootConfiguration注解
1.可以看到,SpringBootConfiguration注解除去四个原注解,有两个业务相关注解,
AutoConfigurationImportSelector类
1.Selector,选择器,翻译过来就是自动配置导入选择器
跟到这个类里面看一下
2.注意getCandidateConfigurations这个方法,Candidate,候选人的意思,也就是获取待配置的方法,在这里打个断点
3.debug启动看一下,验证下猜想,查看下configurations这个list里面都有些什么
4.发现有118个类的绝对路径,这118个全路径是哪来的,继续跟代码,点开SpringFactoriesLoader.loadFactoryNames()方法
5.这里注意一下,getOrDefault()点进去会跳到Map.java这个类里面去,所以应该点开loadSpringFactories()方法,发现classLoader不为null的时候会加载第一个,这里就不打断点验证了,下面就是拿到文件路径后通过PropertiesLoaderUtils遍历了最后返回,看看FACTORIES_RESOURCE_LOCATION的值是什么
6.去jar里面查看META-INF/spring.factories文件,不难发现,key=value形式保存的,至于这里为什么是拿org.springframework.boot.autoconfigure.EnableAutoConfiguration的值,自己去在loadSpringFactories这里打断点看下就知道了,拖到最下面,发现一直到了139行,139-21=118,验证了上诉思想
7.那么Spring Boot自动配置已经清楚后,看看AutoConfigurationPackage注解做了一些什么
AutoConfigurationPackage注解
1.通过Import注解导入了一个内部类,AutoConfigurationPackages翻译过来打致是自动配置包,Registrar注册的意思
2.点开Registrar这个内部类发现重写了两个方法registerBeanDefinitions,注册定义bean,这个方法打个断点,重新debug启动一下
3.发现这里拿到了我们启动类所在的包
总结
学习之余随手记录