SpringBoot的方便之处在于简化了十分繁琐的XML配置文件和繁琐的POM依赖管理。SpringBoot要开启某一些功能,只需要在启动类上加上@Enablexxxxxxx
这样的类似注解就能开启,例如事务管理器的功能、异步注解功能等等。Enable的功能就是基于SpringBoot的自动装配功能实现的,既然是自动,说明SpringBoot提供了一定的规则,只要按照这个规则进行开发,就能利用自动装配实现自己的逻辑封装。
@SpringBootAppolication注解是启动类上加的SpringBoot项目标识注解,这个注解由3个子注解完成:
- `@SpringBootConfiguration`:SpringBoot的标识配置类,底层包含`@Configuration`注解,标识这个类也是容器的一个组件可以被当做配置类使用。
- `@EnableAutoConfigration`:自动装配的原理就是它实现的,SpringBoot就会自动去加载一定规则的类当做一个Bean放到IOC容器中。
- `@ComponentScan`:包扫描功能的支持,如果没有指定路径,默认就是扫描当前配置类所在的包及其子包。
这个注解由2个元注解组成:
- `@AutoConfigurationPackage`:用于表示当前配置类所在包的信息保存成一个Bean,供后续SpringBoot使用。
- `@Import(EnableAutoConfigurationImportSelector.class)`:自动装配的核心原理就在这里,import注解会让参数里面的class成为一个bean,不过需要判断这个class是否是一个importSelector,如果是,则这个类的实现方法会返回一个类的全限定名数组,用来生成bean。
刚才的EnableAutoConfigurationImportSelector.class实现了一个接口叫DeferredImportSelector
,这个接口同样继承自ImportSelector
,不过这个接口比较特殊,这个DeferredImportSelector返回的类全限定名列表会在最后进行实例化(延时加载)和分组排序的功能。
在这个importSelector中会进行对工程目录下所有的META-INF/spring.factories文件进行扫描,解析里面的key-value结构(value就是类的全限定名),将EnableAutoConfiguration为key的value全部找出来并缓存到内存里以供后续使用。这些value的类都会被加载,然后检查是否符装载的要求,例如是否被过滤了,是否满足@Conditional系列注解。
1. 命名规范问题,官方的starter一般命名风格是`spring-boot-starter-xxx`,我们自定义的一般换一个写法更好容易区分。
1. POM中引入spring-boot-configuration-processor,以便提供配置文件处理功能提示。
1. 编写自己satrter的service逻辑等。
1. 在配置类上添加`@ConfigurationProperties`、`@EnableConfigurationProperties`来支持,最后在自己资源目录下面新建`META-INF/spring.factories文件`,将key就是EnableAutoConfiguration,value就是这个配置类的全限定名。
1. 新的工程POM引入这个starter包以后,有2种方式来开启刚才starter的新功能:
1. 使用@Import注解来将starter的核心配置类导入,即便完成。
1. 使用@Enablexxxx的形式来开启(前提是starter提供了这个注解,其实这种注解底层也就是@Import)。