抽取封装代码
- 创建对应的XX-starter项目
- 导入项目需要的依赖以及对应的代码
- 通过
**@ConfigurationProperties**
进行配置文件与属性类的绑定,并且通过**@EnableConfigurationProperties**
使得@ConfigurationProperties生效 - 导入
**spring-boot-configuration-processor**
依赖,使得在application.properties文件中能有**相应的提示**
- 保证starter项目中能够独立运行
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@Import封装
- 将starter项目封装好后,因为Springboot程序
**只会扫描启动类所在的包以及子包**
,因此即使导入starter项目后,仍然**扫描不到对应的组件**
。 - 可以将
**所有的组件封装在一个Configuration类**
中,在这个Configuration类中**通过@Import导入starter中所有的组件**
,此时**只需要通过@Import导入这个Configuration类**
就可以导入starter所需要的所有组件,从而能够正常运行服务。 - 此时只需要在使用服务的地方,通过@Import导入相关的Configuration类,就可以正常使用starter相关的服务。
封装Enable注解
- 使用@Import注解导入对应的Configuration配置类,虽然可以正常使用starter相关的服务,但
**使用者通常不清楚该Configuration的类名**
,因此这种导入方式不实用 - 因此可以
**封装相关的Enable注解**
,starter中提供相关的Enable注解,**将@Import封装在Enable注解中**
,Enable注解起名是简洁的,因此调用者可以很方便的进行添加。 - 因此只需要在启动类或配置文件中添加Enable注解,就会导入starter的相关组件,从而能够使用到相关的服务
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import(RobotAutoConfiguration.class)
public @interface EnableRobot {
}
通过SPI机制
- 封装Enable注解虽然已经很简化导入的流程,但是仍然需要添加相关的注解
- 可以通过SPI自动装配机制实现自动导入实现类
- 需要在starter中创建
**META-INF/spring.factories**
文件,并且将对应的Configuration全类名配置上去
# springboot自动装配机制 会读取该配置 进行自动装配
org.springframework.boot.autoconfigure.EnableAutoConfiguration = com.jokerku.autoconfigure.LogAutoConfigure
- 通过Condition相关注解判断是否加载相关文件