zoukankan      html  css  js  c++  java
  • 深入springboot原理——动手封装一个starter

    从上一篇文章《深入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.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-INFspring.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

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

    server:
      port: 8081
      context-path: /

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



    作者:ITPSC
    出处:http://www.cnblogs.com/hjwublog/

  • 相关阅读:
    bootstrap 幻灯片(轮播)
    图片轮播
    JS 标签页切换(复杂)
    JS 标签页切换
    js获取日期时间
    HTML标签marquee实现滚动效果
    webstorm 快捷键,很多人想知道的三个常用快捷键
    js红包算法随机分配
    node.js express,ejs后端模板
    递归思路简单例子
  • 原文地址:https://www.cnblogs.com/chongaizhen/p/11156293.html
Copyright © 2011-2022 走看看