自定义一个starter,实现获取系统和程序信息。
0. 项目结构
org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件是用来加载自动配置类的,该文件必须放在META-INF/spring/目录下。
1. 创建项目
创建一个普通的maven项目,使用quickstart进行构建。
这里需要注意jdk版本选择:springboot 2.0 需要选择jdk8+,springboot 3.0 需要选择jdk17+。
2. 导入依赖
导入父容器,进行版本控制;导入自动配置依赖,这是实现starter的核心依赖。
<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.huan</groupId>
<artifactId>myStart</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>myStart</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 导入父容器,进行版本控制 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- *** 导入自动配置依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
这里我删掉了默认的测试依赖,所以需要删掉test类,不然后面打包会报错。
3. 创建属性结构类
这里使用@ConfigurationProperties(prefix = "huan.system")注解,来绑定外部配置文件中的属性到 Java 类中。
例如,可以通过在application.properties
或 application.yml配置文件中配置“huan.system.copyright”和“huan.system.author”属性批量配置SystemInfoPro
类的 copyright
和 author
字段。
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "huan.system")
public class SystemInfoPro {
private String copyright;
private String author;
}
4. 创建和实现工具接口
创建接口。
public interface ISystemInfoUtil {
public String getAppInfo();
public String getSystemInfo();
}
实现接口。
public class SystemInfoUtil implements ISystemInfoUtil{
@Autowired
private SystemInfoPro systemInfoPro;
@Autowired
private ConfigurableEnvironment env;
@Override
public String getAppInfo() {
return systemInfoPro.getCopyright()+"\t"+systemInfoPro.getAuthor();
}
@Override
public String getSystemInfo() {
return env.getProperty("os.name")+"\t"+env.getProperty("user.home");
}
}
5. 创建自动配置类
自动配置类中使用@EnableConfigurationProperties注解使@ConfigurationProperties注解生效,并将指定的类注入到ioc容器中进行管理。并配合
@Conditional注解,只有达到某种条件才会进行自动配置,避免不必要的配置和依赖问题。
@Configuration
@EnableConfigurationProperties({SystemInfoPro.class})
@ConditionalOnClass({SystemInfoPro.class,ISystemInfoUtil.class})
public class SystemInfoAutoConfiguration {
//业务类的bean
@Bean
@ConditionalOnMissingBean({ISystemInfoUtil.class})//容器中没有ISystemInfoUtil类型的bean时,创建一个
public ISystemInfoUtil systemInfoUtil(){
System.out.println("创建了SystemInfoUtil类型的bean");
return new SystemInfoUtil();
}
}
6. 创建.imports
文件
在resources/META-INF/spring/目录下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,并引入自动配置类。
# 引入系统信息自动配置
com.huan.SystemInfoAutoConfiguration
注意:当正确配置.imports文件后,图标会发生变化,如果没改,可能是结构出了问题,比如没有spring文件夹之类的。
7. 打包starter为非执行文件
使用install进行打包,将jar放入本地仓库。
8. 使用starter
1. 创建一个springboot项目
2. 引入自定义starter依赖
<dependency>
<groupId>com.huan</groupId>
<artifactId>myStart</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3. 创建控制类
在控制类中注入工具类,并使用其方法。
@RestController
public class HelloController {
@Autowired
private ISystemInfoUtil systemInfoUtil;
@RequestMapping("/")
public String index() {
return systemInfoUtil.getSystemInfo()+"\n"+systemInfoUtil.getAppInfo();
}
}
4. 配置配置文件
huan.system.copyright=huan info company
huan.system.author=huan
5. 启动springboot
正确创建了SystemInfoUtil类型的bean。
访问网页。