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"]
诸葛