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"]
诸葛
原文地址:https://www.cnblogs.com/1446358788-qq/p/14296106.html