自动配置是指:
自动配置是指在应用程序启动时,SpringBoot根据classpath路径下的jar包自动配置应用程序所需的一系列bean和组件,从而减少开发者的配置工作,提高开发效率。
一:Condition
Condition是spring4.0之后添加的条件判断功能,通过这个功能可以实现选择性的创建Bean操作。Condition 接口定义了一个方法 matches (ConditionContext context, AnnotatedTypeMetadata metadata)。
语法:
@Condition({"要扫的包1","要扫的包2"})
添加在启动类上,当前项目启动时会自动扫描参数中包名的所有bean对象并将其存储到IOC容器中。
优势:
能全面的扫描的包内的所有bean对象。
缺点:
性能慢,开发中不是所有的bean都需要(主流开发不使用)。
二:@Enable
@Enable被大量用于进行启动某些功能,其底层使用的就是@import注解。导入一些配置类,实现Bean的动态加载。
@Import注解
@Enable底层依赖于@Import注解导入一些类,使用@Import导入的类会被Spring加载到IOC容器中。
而@Import提供4中用法:
① 导入Bean
② 导入配置类
③ 导入 ImportSelector 实现类。一般用于加载配置文件中的类 //最常用的
④ 导入 ImportBeanDefinitionRegistrar 实现类。
走一遍源码:
这里@SpringBootApplication是自动装配的注解,进入
这里发现了很多注解,其中有三个叫
@SpringBootConfiguration
:组合了@Configuration
注解,表示这是一个配置类
@EnableAutoConfiguration
:允许自动配置
@ComponentScan
:Spring的组件扫描,默认扫描main方法所在类所在的包及其子包
其中第二个注解@EnableAutoConfiguration
是实现自动配置的关键。
从@EnableAutoConfiguration
注解进入:
这里有个@Import的注解,里面存放了一个AutoConfigurationImportSelector的类,
我们进这个类:
这个类实现了DeferredImportSelector等接口
在DeferredImportSelector接口中有一个selectImports,里面规定了哪些Bean需要被自动装配,根据里面的方法:this.getCandidateConfigurations方法进入,
查看load方法
该方法进入了一个META-INF/spring的目录,文件后缀是.imports
可以在左侧的依赖里面进行查看,这里面有133个Bean,可以被自动装配,也就是常用的自动装配的哪些Bean。
总结:
启动类中有一个@SpringBootApplication注解,包含了@EnableAutoConfiguration代表开启自动装配
@EnableAutoConfiguration注解里面组合了一个@Import
注解,这个注解是实现自动配置的关键。
@Import
注解最终的作用可以总结如下:到spring-boot-autoconfigure包下的META-INF/spring目录中寻找.imports结尾的文件,这里面列举了所有需要自动配置的类,程序会读取这些类并加载(但这些类不会全部加载,因为有的类上面有条件注解,需要满足特定条件时才会生效)
三:自动义启动器
1、创建autoconfigure模块 并添加自动配置的支持,如:@ConditionalOnClass
和@ConditionalOnMissingBean
。
2、创建starter模块,依赖autoconfigure的模块
3、在autoconfigure模块中初始化对象A的Bean,并定义META INF/spring.factories文件
4、在测试模块中引入自定义的starter依赖,测试获取对象A的Bean,输出A的地址。