086. Starter 快速集成机制详解

原创
2020/10/26 10:41
阅读数 55

1. Starter 介绍


1.1. 作用

  • 启动器(starter)包含许多依赖项,这些依赖项是使项目快速启动和运行所需的依赖项。
  • 例如通过配置 spring-boot-starter-data-redis,可以快捷地使用 Spring 对 Redis 进行数据访问。

1.2. 命名规范

  • 官方提供的 starter 遵循类似的命名规范:spring-boot-starter-*。
  • 第三方 starter 命名应当遵循 thirdpartyproject-spring-boot-latest。

1.3. 常用 starter

  • spring-boot-starter-jdbc
  • spring-boot-starter-data-redis
  • spring-boot-starter-web
  • spring-boot-starter-actuator

2. Web 开发示例


  • 引入 spring-boot-starter-web 实现快速引入和启动,无需再进行烦杂的 xml 配置。
  • 默认基于 Tomcat 容器运行,可通过修改 pom.xml 指定运行的容器。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3. 自研 Starter 的步骤


  1. 建工程。
  2. 引入 spring-boot-starterspring-boot-autoconfigue、第三方 jar。
  3. 如需要生成配置元信息,加入 spring-boot-consiguration-processon 依赖。
  4. 编写自动配置类。
  5. 配置发现配置文件(META-INF/spring.factories)。
  6. 打包发布。

4. 自研 Starter 示例


4.1. 创建一个 保存属性的项目(girl)

  • 项目结构

    image-20200709152545043

  • pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.1.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.learn</groupId>
        <artifactId>girl</artifactId>
        <version>1.0.0</version>
        <name>girl</name>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    
    </project>
    
  • GirlDemo

    @Data
    public class GirlDemo {
    
        private String name;
    
        private String length;
    
        private String face;
    
    }
    

4.2. 创建一个自定义的 starter(girl-spring-boot-starter)

  • 项目结构

    image-20200709152838372

  • pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.1.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.learn</groupId>
        <artifactId>girl-spring-boot-starter</artifactId>
        <version>1.0.0</version>
        <name>girl-spring-boot-starter</name>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-autoconfigure</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
    
            <dependency>
                <groupId>com.learn</groupId>
                <artifactId>girl</artifactId>
                <version>1.0.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    
        <build>
            <resources>
                <resource>
                    <directory>META-INF</directory>
                    <targetPath>META-INF/</targetPath>
                </resource>
            </resources>
        </build>
    
    </project>
    
  • GirlProperties

    @Data
    @ConfigurationProperties(prefix = "com.girl")
    public class GirlProperties {
    
        private String name;
    
        private String length;
    
        private String face;
    
    }
    
  • GirlAutoConfigure

    @Configuration
    @EnableConfigurationProperties(GirlProperties.class)
    public class GirlAutoConfigure {
    
        @Bean
        public GirlDemo getGirl(GirlProperties properties) {
            GirlDemo g = new GirlDemo();
            g.setName(properties.getName());
            g.setLength(properties.getLength());
            g.setFace(properties.getFace());
            return g;
        }
    
    }
    
  • spring.factories

    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      com.learn.girl.autoconfigure.GirlAutoconfigure
    

4.3. 项目中使用自定义的 starter

  • 添加依赖(pom.xml)

    <dependency>
        <groupId>com.learn</groupId>
        <artifactId>girl-spring-boot-starter</artifactId>
        <version>1.0.0</version>
    </dependency>	
    
  • 添加配置(application.yml)

    com:
      girl:
        name: test
        length: 180
        face: 111
    
  • 测试

    @RestController
    public class MyController {
    
        @Autowired
        private GirlDemo girlDemo;
    
        @GetMapping("index")
        public String index() {
            return girlDemo.toString();
        }
    
    }
    
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部