如何自定义一个springboot starter,以供之后项目引用使用
新建一个maven项目,并引入必须的依赖
1、这种用于starter的项目的名称一般格式为:xxx-spring-boot-starter,并且在创建项目时规范好包名称。
2、引入相关的依赖
3、创建starter要实现的功能模块(就是之后你生成的依赖所要使用的功能,只要在别的项目被引入maven依赖,就可以直接使用这里面的方法了。)
下面是实现的一个以“,”分割字符串的小功能的实现代码:
ISplitService
package com.johnhum.springboot.service;
import java.util.List;
/**
* @author Johnhum on 2021/7/18
*/
public interface ISplitService {
List<String> split(String value);
}
SplitServiceImpl
package com.johnhum.springboot.service.impl;
import com.johnhum.springboot.service.ISplitService;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author Johnhum on 2021/7/18
*/
public class SplitServiceImpl implements ISplitService {
@SuppressWarnings("all")
@Override
public List<String> split(String value) {
return Stream.of(StringUtils.split(value, ",")).collect(Collectors.toList());
}
}
4、重头戏来咯,这里的SplitAutoConfigure类是实现把创建的字符串分割功能以配置组件的形式加入IOC容器中,方便被扫描。
package com.johnhum.springboot.conf;
import com.johnhum.springboot.service.ISplitService;
import com.johnhum.springboot.service.impl.SplitServiceImpl;
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;
/**
* @author Johnhum on 2021/7/18
*/
@Configuration
@ConditionalOnClass(value = {ISplitService.class, SplitServiceImpl.class})
public class SplitAutoConfigure {
@Bean
@ConditionalOnMissingBean
ISplitService startService() {
return new SplitServiceImpl();
}
}
5、创建spring.factories文件,保证我们所自定义的配置类加入候选配置中(只要别的项目引入该字符串分割功能依赖就立即被加载到springIOC容器中)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.johnhum.springboot.conf.SplitAutoConfigure
注意:spring.factories文件必须要在classpath路径(resources)下的/META-INF文件夹下,并且名字必须为spring.factories。这是因为springboot自动装配机制就是通过这个路径下的spring.factories文件去加载类或者依赖的。
6、打包
运行 mvn clean install -Dmaven.test.skip=true
这样就会打包到我们的maven仓库中,进入仓库目录可以发现已经生成好的split-spring-boot-starter-1.0-SNAPSHOT.jar
7、使用split-spring-boot-starter-1.0-SNAPSHOT.jar
我们在另外的springboot工程中直接引入打好包的依赖。
<dependency>
<groupId>com.johnhum.springboot</groupId>
<artifactId>split-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
8、编写测试类测试
package com.jonhum.springboot;
import com.alibaba.fastjson.JSON;
import com.johnhum.springboot.service.ISplitService;
import com.jonhum.springboot.conf.SpringbootConf;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author Johnhum on 2021/7/18
*/
@Slf4j
@SpringBootTest
public class AppTest {
@Autowired
SpringbootConf springbootConf;
@Autowired
private ISplitService splitServiceImpl;
@Test
public void splitTest() {
log.info("split context: {}", JSON.toJSONString(splitServiceImpl.split(springbootConf.getContext())));
}
}
这里贴出要测试类所在工程的配置文件的截图
测试成功并输出相应方法的结果。