一、why自定义start
??????SpringBoot 最强大的功能就是把常用的场景抽取成了一个个场景启动器starter,开发者通过引入这些场景启动器,再进行少量的配置就能使用相应的功能,但SpringBoot不能囊括所有的使用场景,所以需要自定义starter来简化我们对SpringBoot的使用。
二、如何实现
自动配置如何编写?参考SpringBoot源码 @WebMvcAutoConfiguration 适配器 WebMvcAutoConfigurationAdapter 由此联想自定义start需要如下配置
@Configuration // 指定这个类是一个配置类
@ConditionalOnXXX // 指定条件成立的情况下自动配置类生效
@AutoConfigureOrder // 指定自动配置类的顺序
@Bean // 向容器中添加组件
@ConfigurationProperties // 结合相关xxxProperties来绑定相关的配置
@EnableConfigurationProperties // 让xxxProperties生效加入到容器中
要将自动配置类配置在META‐INF/spring.factories中,自动配置类才能加载。 参照 spring-boot-starter 发现其是没有实现代码,但在其 pom.xml 文件中发现有spring-boot-autoconfigure 依赖,关于web的自动配置都在这里。 由此可知
- 场景启动器 starter 是一个空的jar文件,仅仅提供辅助性依赖管理,这些依赖可能用于自动装配或其他类库。
- 需要专门写一个类似 spring-boot-autoconfigure 的配置模块
- 使用的时候只需要引入 starter,就可以使用自动配置。
三、实现过程
命名规范
- SpringBoot 命名空间: spring-boot-starter-模块名 如:spring-boot-starter-web
- 自定义命名空间: 模块名-spring-boot-starter
1. 创建项目 ??????一个父 maven 项目 springboot-starter-custom 以及其下两个 Module 项目 mystarter-spring-boot-starter 和 mystarter-spring-boot-starter-autoconfigure 注意: 如果使用 spring Initializr 创建项目需要删除启动类,resources下文件以及 test 文件。 2. maven 父项目 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.aword.springboot</groupId>
<artifactId>springboot-starter-custom</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modules>
<module>mystarter-spring-boot-starter</module>
<module>mystarter-spring-boot-starter-autoconfigure</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!--提供source-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3. Module项目 mystarter-spring-boot-starter 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">
<parent>
<artifactId>springboot-starter-custom</artifactId>
<groupId>com.aword.springboot</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mystarter-spring-boot-starter</artifactId>
<dependencies>
<dependency>
<groupId>com.aword.springboot</groupId>
<artifactId>mystarter-spring-boot-starter-autoconfigure</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 如果当前 starter 还需要其他的类库就在这里引用-->
</dependencies>
</project>
4. Module 项目 mystarter-spring-boot-starter-autoconfigure 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">
<parent>
<artifactId>springboot-starter-custom</artifactId>
<groupId>com.aword.springboot</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mystarter-spring-boot-starter-autoconfigure</artifactId>
<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>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.0</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
spring.factories 文件 (resources 下创建文件夹 META-INF 及文件 spring.factories)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.aword.starter.MyAutoConfiguration
MyAutoConfiguration.java
@Configuration
@ConditionalOnProperty(value = "aword.user.name")
@EnableConfigurationProperties(UserProperties.class)
//@ConditionalOnClass(StrUtil.class)
public class MyAutoConfiguration {
@Autowired
UserProperties userProperties;
@Bean
public MyController myController() {
return new MyController(userProperties);
}
}
MyController.java
@RestController
public class MyController {
UserProperties user;
public MyController(UserProperties user) {
this.user = user;
}
@RequestMapping("/")
public String index(){
return "用户名: " + user.getName();
}
}
UserProperties.java
@ConfigurationProperties("aword.user")
public class UserProperties {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5. IDEA中 install 将项目安装成本地 jar 包
四、测试starter
创建一个新的 SpringBoot 项目,通过 pom.xml 文件将打包好的自定义 starter 引入项目中。
<dependency>
<groupId>com.aword.springboot</groupId>
<artifactId>mystarter-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
application.properties 文件
server.port=8001
aword.user.name=那棵橘子树
启动项目,浏览器中访问 http://localhost:8001/
文章仅供学习交流,侵权联系删除。
|