一、简介
SpringBoot最强大的功能就是把我们常用的场景抽取成了一个个starter(场星动,我们通过引入springboot为我提供的这些场景启动器,我们再进行少量的配置就能使用相应的功能。即使是这样,springboott也不能囊括我们所有的使用场景,往往我们需要自定义starter,来简化我们对springboot的使用。
二、自定义starter
自定义starter的命名规则
SpringBoot提供的starter以spring-boot-starter-xxx的方式命名的。
官方建议自定义的starter使用 xxx-spring-boot-starter命名规则。以区分SpringBoot生态提供的starter。
官方建议自定义的autoconfigure使用 xxx-spring-boot-autoconfigure命名规则。以区分SpringBoot生态提供的autoconfigure。
现有一需求,创建一个starter,其功能是为项目提供首页,限制是只有在配置属性clyu.hello.name后,才会生效
其项目结构如下
2.1 创建clyu-spring-boot-autoconfigure
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2.2 HelloProperties
@ConfigurationProperties(prefix = "clyu.hello")
public class HelloProperties {
private String name;
//忽略get和set方法
}
2.3 HelloController
@RestController
public class HelloController {
private HelloProperties helloProperties;
public HelloController(HelloProperties helloProperties){
this.helloProperties = helloProperties;
}
@RequestMapping("/")
public String hello(){return "欢迎"+helloProperties.getName(); }
}
2.4 HelloAutoConfigure
@Configuration
@ConditionalOnProperty("clyu.hello.name") //项目中必须有这个
@EnableConfigurationProperties(HelloProperties.class)
//@EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入
public class HelloAutoConfigure {
@Autowired
private HelloProperties helloProperties;
@Bean
public HelloController helloController(){
return new HelloController(helloProperties);
}
}
2.5 spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
clyu.spring.boot.autoconfigure.HelloAutoConfigure
2.6 创建clyu-spring-boot-starter
引入clyu-spring-boot-autoconfigure
<dependencies>
<!--autoconfigure-->
<dependency>
<groupId>learning</groupId>
<artifactId>clyu-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--如果当前starter还需要其他的类库就在这里引用-->
</dependencies>
三、测试
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>learning</groupId>
<artifactId>clyu-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
在配置类加入下面配置
clyu.hello.name = "hello"
去掉配置中的clyu.hello.name
#clyu.hello.name = "hello"