zoukankan      html  css  js  c++  java
  • Spring Cloud微服务实战 打造企业级优惠券系统 3-13 SpringBoot自定义Starter

    0    课程地址

    https://coding.imooc.com/lesson/380.html#mid=28597

    1    浓缩精华
    1.1  4代码演练
    2    个人关注
    2.1  参考

    https://www.cnblogs.com/1446358788-qq/p/12664305.html

    3    课程内容
    3.1  SpringBoot自动配置的步骤

    a  SpringBoot启动的时候从依赖的包里resource目录下寻找springfactories文件,根据文件配置jar包找到项目依赖的jar包(类似java的spi机制);

    b  根据springfactories加载autoconfig类

    c  根据条件注解@Conditional条件自动配置,并将bean注入spring容器中,以便我们在其他的依赖starter的项目中可以使用到它;

    4    代码演练
    4.1  自定义starter

    1  starter创建:新建maven项目

     

    2  starter创建: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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <!--工程坐标,maven打包的格式-->
        <groupId>com.imooc.springboot</groupId>
        <artifactId>split-spring-boot-starter</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <!-- parent标签,依赖的父项目-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starters</artifactId>
            <version>2.1.4.RELEASE</version>
        </parent>
    
        <!-- maven的jdk的依赖源和标识的版本 -->
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    
    
        <dependencies>
            <!-- spring默认使用yml中的配置,但有时候要用传统的xml或properties配置,就需要使用spring-boot-configuration-processor了。-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
    
            <!-- 自动配置的相关依赖,定义starter的时候必须要有 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-autoconfigure</artifactId>
            </dependency>
        </dependencies>
    
    
    </project>

    3  starter创建:创建split服务接口

    package com.imooc.springboot.service;
    
    import java.util.List;
    
    /**
     * 字符串分隔符定义
     */
    public interface ISplitService {
        public List<String> splitString(String sValue);
    }

    4  starter创建:创建split服务实现类

    package com.imooc.springboot.service.impl;
    
    import com.imooc.springboot.service.ISplitService;
    import org.springframework.util.StringUtils;
    
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    /**
     * SplitService
     *
     * @author 魏豆豆
     * @date 2021/5/23
     */
    public class SplitService implements ISplitService {
        @Override
        public List<String> splitString(String sValue) {
            return Stream.of(StringUtils.split(sValue,",")).collect(Collectors.toList());
        }
    }

    5  starter创建:创建自动配置类:

    package com.imooc.springboot.config;
    
    import com.imooc.springboot.service.ISplitService;
    import com.imooc.springboot.service.impl.SplitService;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.List;
    
    /**
     * SplitAutConfig
     *
     * @author 魏豆豆
     * @date 2021/5/24
     */
    @Configuration//自动配置类
    @ConditionalOnClass(value = {ISplitService.class,SplitService.class})//类路径下发现这些class才会自动配置,注意这里的写法
    public class SplitAutConfig {
    
        //获得ISplitService,注意这里的写法
        @Bean
        @ConditionalOnMissingBean//条件注解,Spring上下文不存在该bean的时候才会自动配置
        ISplitService getSplitService(){
            return new SplitService();
        }
    
    }

    6  starter创建:springfactories配置配置类路径,以便使用该starter时进行加载

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.imooc.springboot.config.SplitAutConfig

    7  starter创建:编译打包starter

    mvn clean install -Dmaven.test.skip=true

    8  将打好的starter包放到本地仓库

    9  新项目引入starter依赖:pom.xml

            <dependency>
                <groupId>com.imooc.springboot</groupId>
                <artifactId>split-spring-boot-starter</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>

    10  编写测试案例

    package com.imooc.springboot.application.service;
    
    import com.alibaba.fastjson.JSON;
    import com.imooc.springboot.service.ISplitService;
    import lombok.extern.slf4j.Slf4j;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    /**
     * TestSplitService
     *
     * @author 魏豆豆
     * @date 2021/5/26
     */
    @Slf4j
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class TestSplitService {
    
        @Autowired
        private ISplitService iSplitService;
    
        @Test
        public void testSplit(){
            log.info(JSON.toJSONString(iSplitService.splitString("111,222,444,333")));
        }
    }

    11  测试结果

    2021-05-27 07:02:15.243  INFO 26088 --- [           main] c.i.s.a.service.TestSplitService         : ["111","222,444,333"]
    5    问题解决
    5.1  idea重新配置了maven的maven home directory之后:Invalid Maven home directory configured

     

    5.2  String.split("")和SpringUtils.split(注意String.split的对象为空的情况)
            System.out.println("StringSplit=="+JSON.toJSONString("111,222,333".split(",")));
            System.out.println("spring的StringUtilSplit=="+ JSON.toJSONString(StringUtils.split("111,222,333",",")));
    
    
    StringSplit==["111","222","333"]
    spring的StringUtilSplit==["111","222,333"]
    诸葛
  • 相关阅读:
    More Effective C++ 条款34 如何在一个程序中结合C++和C
    More Effective C++ 条款33 将非尾端(non-leaf classes)设计为抽象类(abstract classes)
    More Effective C++ 条款32 在未来时态下发展程序
    win10子系统Ubuntu18.04下安装图形界面
    转载:Intel MKL 稀疏矩阵求解PARDISO 函数
    免费电子书下载
    Parallel Studio XE 调用 BLAS95 + LAPACK95 + IMSL
    linux后台运行和关闭、查看后台任务
    (转载)nohup命令让Linux程序永远在后台执行
    Linux 基本系统信息查询
  • 原文地址:https://www.cnblogs.com/1446358788-qq/p/14296106.html
Copyright © 2011-2022 走看看