为什么会出现springboot
spring配置较为繁琐,为了简化配置,在spring4.0之后 ,springboot出现,它实现了自动化配置
初入springboot
在刚进入springboot学习的时候,如何去学习这个微框架。
1.springboot有什么优点
根据我的了解,它主要有三个优点
-
它提供大量的默认配置,简化了项目的配置
-
它的内嵌式容器简化了Web项目
-
没有xml配置的要求
2.springboot的自动装配原理
这个从springboot的主启动类SpringbootApllication开始看起 -
可以看到主启动类上的@SpringBootApplication注解,ctrl+鼠标点击进去可以看到以**解
@ComponentScan它扫描了主启动类同级下的包
现在对@[email protected]这两个核心注解进行了解
@SpringBootConfiguration,点进去可以看到@Configuration,说明主启动类也是spring的一个配置类,从@Configuration下的@Component注解了解到它也是spring的一个组件。
@EnableAutoConfiguration,看这个名字就知道它是实现自动配置的核心注解,进入看看
可以看到@AutoConfigurationPackage:自动配置包。进入其进行了解
@Import({Registrar.class})他负责导入自动注册包(被扫描到的包会到这里进行注册)
返回上一步可以看到@Import({AutoConfigurationImportSelector.class})这个是自动导入包的核心
自动导入选择器,现在是关键,它选择了啥东西点进去看一下
getAutoConfigurationEntry 获取自动配置实体
getCandidateConfigurations 获取候选的配置
可以看到以上两个方法
在getCandidateConfigurations方法下可以看到它标记了EnableAutoConfiguration
认真的看一下这个getCandidateConfigurations方法,可以看到
它加载了标记了的类,就是加上@EnableAutoConfiguration注解的类会被加载,所以他获取了主启动类下加载的所有组件。
上面的 loadFactoryNames方法点进去了解一下
他获取了所有的加载配置,那么在哪获取?获取哪些配置呢?看一下loadSpringFactories这个方法
Enumeration urls = classLoader != null ? classLoader.getResources(“META-INF/spring.factories”) : ClassLoader.getSystemResources(“META-INF/spring.factories”);
META-INF/spring.factories这个位置在 springboot-autoconfig的包下《所有配置类都在这》
两个地址,一个从项目中获取,一个从系统中获取
while(urls.hasMoreElements()) {
URL url = (URL)urls.nextElement();
UrlResource resource = new UrlResource(url);
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
Iterator var6 = properties.entrySet().iterator();
。。。。。。。。
从这个代码可以看出,它从资源中遍历了所有课自动配置的包,封装成properties供我们使用。
那为啥有的注解不生效咧
@ConditionalOnxxx(条件,条件)条件全部满足才会生效
小结:springboot所有的自动配置在启动主启动类时,会被加载到spring.factories中,当有对应的启动器时,它将会生效。
spring-boot-starter-XXX
配置文件中可配置的东西,都有其对应的xxxproperties 文件(封装配置文件的相关属性)与其绑定。
可以通过修改配置文件去动态修改springboot中的默认配置