Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,Spring Boot就能自动扫描并加载相应的模块。SpringBoot提供的starter以spring-boot-starter-xxx的方式命名的。官方建议自定义的starter使用xxx-spring-boot-starter命名规则。以区分SpringBoot生态提供的starter。
1、maven添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.squirrelframework</groupId>
<artifactId>squirrel-foundation</artifactId>
<version>0.3.8</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2、新建配置类,写好配置项和默认的配置值,指明配置项前缀。
@Data
@ConfigurationProperties(prefix = "state.machine")
public class StateMachineProperties {
/**
* 状态机类的全限定名
*/
private String clazz;
/**
* 是否启动默认配置
*/
private boolean autoConfig;
}
3、新建自动装配类,使用@Configuration和@Bean来进行自动装配;
,创建builder并注入。
@Configuration
@EnableConfigurationProperties(StateMachineProperties.class)
public class StateMachineConfig {
@Resource
private StateMachineProperties stateMachineProperties;
@Bean
public UntypedStateMachineBuilder builder() throws ClassNotFoundException {
if (stateMachineProperties.isAutoConfig()) {
Class clazz = Class.forName(stateMachineProperties.getClazz());
if (clazz == null) {
throw new SquirrelAutoConfigException("指定状态机类不存在");
}
UntypedStateMachineBuilder builder = StateMachineBuilderFactory.create(clazz);
return builder;
}
return null;
}
}
4、定义配置异常类
public class SquirrelAutoConfigException extends RuntimeException {
private static final long serialVersionUID = -4606172299202646819L;
public SquirrelAutoConfigException() {
super();
}
public SquirrelAutoConfigException(String message) {
super(message);
}
public SquirrelAutoConfigException(String message, Throwable cause) {
super(message, cause);
}
public SquirrelAutoConfigException(Throwable cause) {
super(cause);
}
}
5、创建状态机后处理类,在创建状态机后注入到Spring中。
@Component
public class StateMachineAutowireProcessor implements SquirrelPostProcessor<StateMachine>, ApplicationContextAware {
private ApplicationContext applicationContext;
public StateMachineAutowireProcessor() {
// 注册后处理器
SquirrelPostProcessorProvider.getInstance().register(StateMachine.class, this);
}
@Override
public void postProcess(StateMachine stateMachine) {
Preconditions.checkNotNull(stateMachine);
// 将状态机注入到Spring
AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory();
autowireCapableBeanFactory.autowireBean(stateMachine);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
6、新建spring.factories文件,指定Starter的自动装配类,spring.factories文件位于resources/META-INF目录下,需要手动创建;
org.springframework.boot.autoconfigure.EnableAutoConfiguration后面的类名说明了自动装配类,如果有多个 ,则用逗号分开;
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.squirrelframework.foun
7、application.yml增加默认配置
state:
machine:
auto-config: false