文章主目录
从上一篇文章《深入springboot原理——一步步分析springboot启动机制(starter机制)》
我们已经知道springboot的起步依赖与自动配置的机制。spring-boot-starter-xxx是官方提供的starter,xxx-spring-boot-starter是第三方提供的starter。starter.jar提供jar引入,autoconfigure.jar实现自动配置。下面我们就来封装一个自己的starter。
回到顶部
新建组件com-itpsc-service
pom文件
<groupId>com.itpscgroupId>
<artifactId>com-itpsc-serviceartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
<name>com-itpsc-servicename>
<description>com-itpsc-servicedescription>
编写UserService类
package com.itpsc.service;
public class UserService {
private String username;
private String password;
...
}
回到顶部
idea终端里面输入命令mvn install package打包到maven仓库。
回到顶部
新建一个名称为itpsc-spring-boot-starter启动组件
引入spring-boot-starter、spring-boot-autoconfigure、spring-boot-configuration-processor
这些Jar在编写自动配置类、注解、生成配置元数据处理等功能依赖的jar包。
<groupId>com.itpsc.spring.bootgroupId>
<artifactId>itpsc-spring-boot-starterartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<version>2.0.4.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-autoconfigureartifactId>
<version>2.0.4.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<version>2.0.4.RELEASEversion>
dependency>
<dependency>
<groupId>com.itpscgroupId>
<artifactId>com.itpsc.serviceartifactId>
dependency>
dependencies
回到顶部
UserProperties.java,使用@ConfigurationProperties注解将配置文件(yml/properties)中指定前缀的配置转为bean。
package com.itpsc.spring.boot.starter;
...
@ConfigurationProperties(prefix = "com.itpsc")
public class UserProperties {
private String username;
private String password;
...
}
UserAutoConfiguration.java,@Configuration 注释使类成为bean的工厂。
@EnableConfigurationProperties注解使@ConfigurationProperties注解生效。
package com.itpsc.spring.boot.starter;
...
@Configuration
@EnableConfigurationProperties(UserProperties.class)
public class UserAutoConfiguration {
@Bean
public UserService getBean(UserProperties userProperties) {
//创建组件实例
UserService userService = new UserService();
userService.setUsername(userProperties.getUsername());
userService.setPassword(userProperties.getPassword());
return userService;
}
}
回到顶部
\META-INF\spring.factories该文件用来定义需要自动配置的类,springboot启动时会进行对象的实例化,会通过加载类SpringFactoriesLoader加载该配置文件,将文件中的配置类加载到spring容器。
在src/main/resources新建META-INF文件夹,在META-INF文件夹下新建spring.factories文件。配置内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.itpsc.spring.boot.starter.UserAutoConfiguration
回到顶部
idea终端里面输入命令mvn install package打包到maven仓库。
测试starter
我们在springboot-mybatis-demo项目中引入starter
<dependency>
<groupId>com.itpsc.spring.bootgroupId>
<artifactId>itpsc-spring-boot-starterartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
当在yml中配置username、password时就可以看到有自动提示了,这是因为引入的jar中包含了元数据文件,详细见下文。
com:
itpsc:
username: "itpsc"
password: itpsc@123
元数据文件是在编译器通过处理所有被@ConfigurationProperties注解的节点来自动生成的。
测试在增加一个测试方法
@Autowired
private UserService userService;
@Test
public void testItpscStarter() {
userService.print();
}
运行结果:
2019-01-23 20:22:41.615 INFO 17184 --- [ main] .i.SpringbootMybatisDemoApplicationTests : Started SpringbootMybatisDemoApplicationTests in 11.505 seconds (JVM running for 14.582)
username=itpsc password=itpsc@123
从运行结果可以看出,我们封装的starter中的jar包的bean已经完成了自动配置,说明我们的starter封装成功了。下面补充下上文提到的元数据相关知识。
回到顶部
springboot jar包含元数据文件,提供所有支持的配置属性的详细信息。这些文件旨在允许IDE开发人员在用户使用application.properties 或application.yml文件时提供上下文帮助和自动补全 。
主要的元数据文件是在编译器通过处理所有被@ConfigurationProperties注解的节点来自动生成的。
配置元数据位于jar文件中的META-INF/spring-configuration-metadata.json,它们使用一个具有”groups”或”properties”分类节点的简单JSON格式。
{
"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties",
"defaultValue": 8080,
"name": "server.port",
"description": "Server HTTP port.",
"type": "java.lang.Integer"
},
{
"defaultValue": "\/",
"deprecated": true,
"name": "server.servlet-path",
"description": "Path of the main dispatcher servlet.",
"type": "java.lang.String",
"deprecation": {
"level": "error",
"replacement": "server.servlet.path"
}
这两个json节点server.port、server.servlet-path对应可以在yml或者properties文件中定义
server:
port: 8081
context-path: /
如果不知道spring是否支持某个配置的话,可以查看元数据文件看是否有对应的节点。
原文链接:https://www.cnblogs.com/hjwublog/p/10335464.html