欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-12 17:44:55
从上一篇文章《深入springboot原理——一步步分析springboot启动机制(starter机制)》 我们已经知道springboot的起步依赖与自动配置的机制。spring-boot-starter-xxx是官方提供的starter,xxx-spring-boot-starter是第三方提 ......

从上一篇文章《》

我们已经知道springboot的起步依赖与自动配置的机制。spring-boot-starter-xxx是官方提供的starter,xxx-spring-boot-starter是第三方提供的starter。starter.jar提供jar引入,autoconfigure.jar实现自动配置。下面我们就来封装一个自己的starter。

准备要封装的组件

新建组件com-itpsc-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

package com.itpsc.service;
public class userservice {
    private string username;
    private string password;
    ...
}

打包发布组件

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

新建一个starter

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

 

引入spring-boot-starterspring-boot-autoconfigurespring-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中配置usernamepassword时就可以看到有自动提示了,这是因为引入的jar中包含了元数据文件,详细见下文。

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

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

 

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

 

测试在增加一个测试方法

 

@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格式。

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

 

{
      "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.portserver.servlet-path对应可以在yml或者properties文件中定义

server:
  port: 8081
  context-path: /

如果不知道spring是否支持某个配置的话,可以查看元数据文件看是否有对应的节点。