(转)深入springboot原理——动手封装一个starter

准备要封装的组件

新建组件com-itpsc-service,组件只有一个service。

pom文件

复制代码
<groupId>com.itpsc</groupId>
<artifactId>com-itpsc-service</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>com-itpsc-service</name>
<description>com-itpsc-service</description>
复制代码

编写UserService类

 

复制代码
public class UserService {
    private String username;
    private String password;

    public void print() {
        System.out.println("username="+username + " password="+password);
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
复制代码

打包发布组件

idea终端里面输入命令mvn install package打包到maven仓库。

新建一个starter

新建一个名称为itpsc-spring-boot-starter启动组件

 

引入spring-boot-starter、spring-boot-autoconfigure、spring-boot-configuration-processor

这些Jar在编写自动配置类、注解、生成配置元数据处理等功能依赖的jar包。

 

复制代码
<groupId>com.itpsc.spring.boot</groupId>
<artifactId>itpsc-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
 <packaging>jar</packaging>

<dependencies>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.0.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.0.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <version>2.0.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.itpsc</groupId>
    <artifactId>com.itpsc.service</artifactId>
</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;
    }
}
复制代码

 

配置spring.factories文件

\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

打包发布starter

idea终端里面输入命令mvn install package打包到maven仓库。

 

测试starter

我们在springboot-mybatis-demo项目中引入starter

<dependency>
    <groupId>com.itpsc.spring.boot</groupId>
    <artifactId>itpsc-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

当在yml中配置username、password时就可以看到有自动提示了,这是因为引入的jar中包含了元数据文件,详细见下文。

com:
  itpsc:
    username: "itpsc"
    password: itpsc@123

image

元数据文件是在编译器通过处理所有被@ConfigurationProperties注解的节点来自动生成的。

 

wps418F.tmp[4]

 

测试在增加一个测试方法

 

复制代码
@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格式。

wps89DA.tmp 

 

复制代码
{
      "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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值