springboot 自动配置原理
1. springboot的启动是从启动类开始,那么也从启动类开始分析
点进去@SpringbootApplication这个注解
追踪@EnableAutoConfiguration查看详情
分析@Import 这个注解的作用:
将对象交给springboot工程管理有以下几种方式:
1. 使用xml配置文件 使用<bean> 标签来自动注入对象
2. 使用注解的方式 @Repositorry @Controller @Service @Component
3. 使用java配置的方式 借用注解 @Configuration @Bean
4. 使用@Import注解:以下进行详细的分析这个注解
从源码可以看出@Import 这个注解的使用方式有三种方式:
1. 使用时需要和@Configuration这个注解一起使用
2. 实现一个借口ImportSelector
3. 实现ImportBeanDefinitionRegistrar (偏底层,不讨论)
第一种方式的测试:
第二种方式测试:
相比第一种方式:第二种方式还是比较好的,可以在实现类中写业务逻辑
介绍完@Import之后继续看springboot的源码:
由上面的自定义ImportSelector这个接口的实现类可以看到这个接口获取到需要交由springboot工厂管理的对象的全限定性类名利用反射创建对象。
因为springboot能够自动注入所以肯定和这个ImportSelector这个接口有关系 追踪进去到AutoConfigurationImportSelector这个类寻找selectImports
这个方法
揭开spring.factories 这个配置的神秘面纱
这是这个配置文件的写法,橙色的是键 绿色的是值,而我们需要加载的是EnableAutioConfiguration这个key 便帮你自动配置好了这些类
这些类都是配置类。所以如果要写项目还是不要关闭自动配置的功能比较好。
总结一下就是:
当你启动springboot的启动类,他默认就会开启自动配置利用注解@Import(AutoConfigurationImportSelector.class) 将这个类的对象交给
springboot容器来管理,这个类本身又是ImportSelector的子类那么这个类必定实现了selectImports这个方法,那么springboot容器必定会调用这个方法
创建指定的带有全限定性类名的类的对象,那么为了达到可用性,开发的维护性,等原因,springboot绝对不会真的在这个方法中定义全限定性类名
那么可选的条件就是使用配置文件,来达到复用性和解耦合,如果使用配置文件就要想到 key和value ,根据key获取value,就要获取到自动配置类中
封装的配置文件底层仍然借助IO流进行读取,获取到这些自动配置类的全限定性类名,然后创建这些类的对象 ,将这些自动配置类加入到springboot
容器中进行管理。 其中这些配置类又和自己对应的属性配置类做了映射那么就得到了 完整的场景启动器所需要的配置信息了。