Spring Boot 自定义starter
1) 说明
starter:
-
这个场景需要使用到的依赖是什么?
-
如何编写自动配置?
@Configuration //指定这个类是一个配置类
@ConditionalOnXXX //在指定条件成立的情况下自动配置类生效
@AutoConfigureAfter //指定自动配置类的顺序
@Bean //给容器中添加组件
@ConfigurationPropertie结合相关xxxProperties类来绑定相关的配置
@EnableConfigurationProperties //让xxxProperties生效加入到容器中
自动配置类要能加载
将需要启动就加载的自动配置类,配置在META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
- 自定义starter模式是什么?
Spring Boot 定义starter通用套路:
启动只是用来做依赖导入的;
专门来写一个自动配置模块;
启动器依赖自动配置; 别人使用只需要引入启动器(starter)即可;
命名规则: 自定义启动器名-spring-boot-starter 例如 mybatis-spring-boot-starter;(官方一般把命名放在后面,如org.springframework.boot.spring-boot-starter-logging)
2) 步骤实现
2.1 创建空项目
2.2 添加maven模块
2.3 继续添加Spring Initializr (该模块意义为 为空的starter即bd2star-spring-boot-starter提供引用)
不引入任何模块 目录结构如下:
2.4 启动器pom.xml 中引入自动配置模块
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bd2star.starter</groupId>
<artifactId>bd2star-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 启动器 -->
<dependencies>
<!-- 引入我们自己定义的自动配置模块 -->
<dependency>
<groupId>com.bd2star.starter</groupId>
<artifactId>bd2star-spring-boot-starter-autoconfigurer</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
目录结构为:
创建HelloService.java
package com.bd2star.starter;
public class HelloService {
HelloProperties helloProperties;
public HelloProperties getHelloProperties() {
return helloProperties;
}
public void setHelloProperties(HelloProperties helloProperties) {
this.helloProperties = helloProperties;
}
public String sayHelloBd2star(String name){
return helloProperties.getPrefix() + "-" + name +"-" + helloProperties.getSuffix();
}
}
创建HelloProperties.java
package com.bd2star.starter;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "bd2star.hello")
public class HelloProperties {
private String prefix;
private String suffix;
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
}
创建HelloServiceAutoConfiguration.java
package com.bd2star.starter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnWebApplication //web应用才生效
@EnableConfigurationProperties(HelloProperties.class) // 开启属性文件生效
public class HelloServiceAutoConfiguration {
@Autowired
HelloProperties helloProperties;
@Bean
public HelloService helloService(){
HelloService service = new HelloService();
// 在service中添加属性文件
service.setHelloProperties(helloProperties);
return service;
}
}
在resources文件夹下创建META-INF文件夹 并在内部创建spring.factories文件(参考org/springframework/boot/spring-boot-autoconfigure/2.1.0.RELEASE/spring-boot-autoconfigure-2.1.0.RELEASE.jar!/META-INF/spring.factories下出如下配置)
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.bd2star.starter.HelloServiceAutoConfiguration
先安装自动配置到仓库中 再安装starter
成功后控制台如下:
3) 测试自定义启动器
新建 Spring Boot 项目 并引入web依赖
在新的测试项目pom.xml文件中引入我们自定义的starter
<!-- 引入我们自定义的starter -->
<dependency>
<groupId>com.bd2star.starter</groupId>
<artifactId>bd2star-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
目录结构如下:
新建HelloController.java
package com.bd2star.springboot.controller;
import com.bd2star.starter.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@GetMapping("/hello")
public String hello(){
return helloService.sayHelloBd2star("baobao");
}
}
修改application.properties
bd2star.hello.prefix=Hi
bd2star.hello.suffix=You are Good!
启动项目 访问: