在我们的日常开发工作中,可能会需要开发一个通用模块,以供其它工程复用。SpringBoot就为我们提供这样的功能机制,我们可以把我们的通用模块封装成一个个starter,这样其它工程复用的时候只需要在pom中引用依赖即可,由SpringBoot为我们完成自动装配,下面提供一个自定义starter的开发流程:
创建Starter项目
首先我们要先创建一个starter项目,结构如下:
starter项目和SpringBoot工程结构没有什么区别,下面就把一些特殊的要求罗列一下。
- 命名规范
1.1. SpringBoot官方命名方式
格式:spring-boot-starter-{模块名}
举例:spring-boot-starter-web
1.2. 自定义命名方式
格式:{模块名}-spring-boot-starter
举例:mystarter-spring-boot-starter - 必须引入的依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
定义Starter需要的配置(Properties)类
创建一个配置类(使用ConfigurationProperties注解标识,其中prefix="demo"是定义配置文件key的前缀),用于封装项目中使用到的配置:
package com.demo.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@ConfigurationProperties(prefix = "demo")
public class MyDemoProperties {
private String name;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
编写Starter项目的业务功能
开发自己的业务功能,为了简单,我们这边业务类只定义一个test方法:
package com.demo.service;
import com.demo.properties.MyDemoProperties;
import org.springframework.beans.factory.annotation.Autowired;
public class MyDemoService {
public String name;
public String email;
public MyDemoService(){
}
public MyDemoService(String name, String email){
this.name = name;
this.email=email;
}
public String test(){
String str = "name:" + name + ",email:" + email;
System.out.println(str);
return str;
}
}
编写自动配置类
编写一个自动配置类(使用Configuration注解标识),我们用到了配置注入,所以还要加上EnableConfigurationProperties注解。在自动配置类中,定义我们的业务类(使用Bean注解),如下:
package com.demo.config;
import com.demo.properties.MyDemoProperties;
import com.demo.service.MyDemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(MyDemoProperties.class)
public class MyDemoConfig {
@Autowired
private MyDemoProperties myProperties;
@Bean(name = "demoService")
public MyDemoService demoService(){
return new MyDemoService(myProperties.getName(), myProperties.getEmail());
}
}
编写spring.factories文件加载自动配置类
在resources目录下新建META-INF/spring.factories文件,文件内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.demo.config.MyDemoConfig
其中com.demo.config.MyDemoConfig是我们上面自己定义的自动配置类,应按照你实际使用的定义即可。
打包安装
打包时需要注意一下,SpringBoot 项目打包的 JAR 是可执行 JAR,它的类放在 BOOT-INF 目录下,如果直接作为其他项目的依赖,会找不到类。
可以通过修改pom文件来解决,代码如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
改完后使用maven打包,会在target目录下生成两个JAR,如下:
- mystarter-spring-boot-starter-0.0.1-SNAPSHOT.jar是一个可以被其他应用依赖的 JAR
- mystarter-spring-boot-starter-0.0.1-SNAPSHOT-exec.jar 则是一个可执行 JAR
到目前为止一个自定义的starter项目就算开发完成了,下面我再介绍一下如何在其它项目中使用我们自定义的starter项目。
首先把可依赖包(mystarter-spring-boot-starter-0.0.1-SNAPSHOT.jar)安装至本地仓库或者公司公共仓库,这样就可以让其它项目使用了。下面是我在本地仓库安装的命令:
mvn install:install-file -Dfile=C:/doc/mystarter-spring-boot-starter-0.0.1-SNAPSHOT.jar -DgroupId=com.demo -DartifactId=mystarter-spring-boot-starter -Dversion=0.0.1 -Dpackaging=jar
其它项目引用
-
pom文件中引入我们自定义的starter
<dependency> <groupId>com.demo</groupId> <artifactId>mystarter-spring-boot-starter</artifactId> <version>0.0.1</version> </dependency>
-
配置文件中新增starter用到的配置
其中key的前缀demo前缀就是我们前面在配置类注解中定义的prefix=“demo” -
注入starter中的业务类
package com.example.demospringboot.controller; import com.demo.service.MyDemoService; import com.example.demospringboot.model.UserInfo; import com.example.demospringboot.service.UserInfoService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @RestController @RequestMapping("mystarter") public class MyStarterDemoController { @Autowired private MyDemoService myDemoService; @GetMapping("/test") public String test(){ return myDemoService.test(); } }
测试一下我们的最终功能,可以正常运作,如下:
附starter源码路径:
https://github.com/xiaochao-github/mystarter-spring-boot-starter