Spring Boot为广大开发人员提供了便利。
本文将介绍如何编写Starter,以便开发人员复用本身或项目组的代码。java
代码下载地址:https://gitee.com/jxd134/Spring-Boot-Greeter-Starter.gitgit
项目基于Maven构建,包含如下三个模块:程序员
主项目pom.xml
中内容以下所示(省略部份内容):spring
<groupId>org.example</groupId> <artifactId>spring-boot-custom-starter</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>greeter-library</module> <module>greeter-spring-boot-autoconfigure</module> <module>greeter-spring-boot-starter</module> </modules> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot</artifactId> <version>2.2.5.RELEASE</version> <scope>compile</scope> </dependency> </dependencies> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version> </properties>
须要注意,父项目中打包方式须要设置为
pom
,此外Spring Boot
版本须要明确(可根据项目组规定肯定).apache
项目pom.xml
中内容以下所示(省略部份内容):微信
<parent> <artifactId>spring-boot-custom-starter</artifactId> <groupId>org.example</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>greeter-library</artifactId> <name>greeter-library</name> <version>0.0.1-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build>
此处建立项目启动欢迎代码示例(仅做为举例使用):maven
public String greet(LocalDateTime localDateTime) { String name = greetingConfig.getProperty(USER_NAME); int hourOfDay = localDateTime.getHour(); if (hourOfDay >= 5 && hourOfDay < 12) { return String.format("Hello %s, %s", name, greetingConfig.get(MORNING_MESSAGE)); } else if (hourOfDay >= 12 && hourOfDay < 17) { return String.format("Hello %s, %s", name, greetingConfig.get(AFTERNOON_MESSAGE)); } else if (hourOfDay >= 17 && hourOfDay < 20) { return String.format("Hello %s, %s", name, greetingConfig.get(EVENING_MESSAGE)); } else { return String.format("Hello %s, %s", name, greetingConfig.get(NIGHT_MESSAGE)); } } public String greet() { return greet(LocalDateTime.now()); }
此处,基本完成工具类模块代码编写.函数
工具类已完成封装,此时须要完成工具类的自动化配置代码编写。
Spring Boot项目启动时,会扫描classpath下的spring.factories
文件(位于META-INF
文件夹),根据配置信息加载classpath下的相应配置类。spring-boot
此处,以spring.boot.autoconfigure
依赖下的spring.factories
做为示例:工具
spring.factories
文件中,自动化配置依赖以下所示:
配置类代码以下所示:
@ConfigurationProperties(prefix = "greeter") public class GreeterProperties { private String userName; private String morningMessage; private String afternoonMessage; private String eveningMessage; private String nightMessage; // 省略get/set函数 } @Configuration @ConditionalOnClass(Greeter.class) @EnableConfigurationProperties(GreeterProperties.class) public class GreeterAutoConfiguration { @Autowired private GreeterProperties greeterProperties; @Bean @ConditionalOnMissingBean public GreetingConfig greeterConfig() { String userName = greeterProperties.getUserName() == null ? System.getProperty("user.name") : greeterProperties.getUserName(); String morningMessage = greeterProperties.getMorningMessage() == null ? "Good Morning" : greeterProperties.getMorningMessage(); String afternoonMessage = greeterProperties.getAfternoonMessage() == null ? "Good Afternoon" : greeterProperties.getAfternoonMessage(); String eveningMessage = greeterProperties.getEveningMessage() == null ? "Good Evening" : greeterProperties.getEveningMessage(); String nightMessage = greeterProperties.getNightMessage() == null ? "Good Night" : greeterProperties.getNightMessage(); GreetingConfig greetingConfig = new GreetingConfig(); greetingConfig.put(USER_NAME, userName); greetingConfig.put(MORNING_MESSAGE, morningMessage); greetingConfig.put(AFTERNOON_MESSAGE, afternoonMessage); greetingConfig.put(EVENING_MESSAGE, eveningMessage); greetingConfig.put(NIGHT_MESSAGE, nightMessage); return greetingConfig; } @Bean @ConditionalOnMissingBean public Greeter greeter(GreetingConfig greetingConfig) { return new Greeter(greetingConfig); } }
以上是模块主要代码,主要分为配置信息类,以及自动化配置类:
ConfigurationProperties
读取前缀为greeter
的配置信息;Spring
会加载GreeterAutoConfiguration
中定义的bean。ConditionalOnMissingBean: 被修饰的bean,若是
IOC
中不存在,则会加载至IOC
。
META-INF
文件夹中添加spring.factories
文件,填写自动化配置类的全限定名,以下所示:
org.springframework.boot.com.example.greeter.autoconfigure.EnableAutoConfiguration=\ com.example.greeter.autoconfigure.GreeterAutoConfiguration
当前模块仅须要添加pom.xml
,就能够将starter完美的呈现给用户:
<parent> <artifactId>spring-boot-custom-starter</artifactId> <groupId>org.example</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>greeter-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> <name>greeter-spring-boot-starter</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <greeter.version>0.0.1-SNAPSHOT</greeter.version> <spring-boot.version>2.2.5.RELEASE</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.example</groupId> <artifactId>greeter-spring-boot-autoconfigure</artifactId> <version>${greeter.version}</version> </dependency> <dependency> <groupId>org.example</groupId> <artifactId>greeter-library</artifactId> <version>${greeter.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> </plugins> </build>
引入Spring Boot依赖,以及封装工具模块和自动化配置模块(当前模块相似于代理)。
执行mvn install
命令后,starter
相关jar包存储至maven本地仓库供用户使用。
由于须要打包,所以引入
maven-compiler-plugin
。
示例较为简单,仅需在pom.xml
文件中引入依赖以下所示:
<dependency> <groupId>org.example</groupId> <artifactId>greeter-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
便可实现自制starter的引入(须要注意starter的Spring Boot版本号匹配)。
本文参照
https://www.baeldung.com/spring-boot-custom-starter
一文编写。
PS:
若是您以为个人文章对您有帮助,请关注个人微信公众号,谢谢!