starter的核心即自动装配,通过自动装配原理手动搭建starter。一般构造starter是通过.properties去读取用户配置的信息去构建业务类,或者让用户省去技术的引入配置等。

若是简单依赖第三方jar依赖库,不需要写自动装配配置,则直接写接口或者工具类来生成jar给用户直接调用即可。

从Spring Boot官方提供的Starter的作用来看,Starter组件有如下:

	·涉及相关组件的Jar包依赖
	·自动实现Bean的装配
	·自动声明并且加载application.properties文件中属性配置

1 starter的命名规范

	·自定义 starter,工程命名格式为{xxx}-spring-boot-starter。
	·官方starter,工程命名格式为spring-boot-starter-{xxx}。

2 创建流程规范

	·定义核心业务类,这是该starter存在的意义
	·完成自动配置类,目的是完成业务类的实例化
	·若核心业务类中需要从配置文件获取配置数据,还需要定义一个用于封装配置文件中相关属性的类
	·定义 META-INF/spring.factories 配置文件,用于对自动配置类进行注册。

3案例简介

starter功能介绍

1 默认输出 “no value”
2 接受用户配置的参数,且根据用户输入的配置条件生成不一样的实例

4 创建maven工程

1 引入pom文件

​
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="【国家反诈中心、工信部反诈中心、中国电信联合提醒】"

         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>

    <groupId>com.xxx</groupId>

    <artifactId>example-spring-boot-starter</artifactId>

    <version>1.0-SNAPSHOT</version>

    <properties>

        <java.version>1.8</java.version>

        <springboot.version>2.0.2.RELEASE</springboot.version>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <maven.compiler.source>${java.version}</maven.compiler.source>

        <maven.compiler.target>${java.version}</maven.compiler.target>

    </properties>

    <dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-dependencies</artifactId>

                <version>${springboot.version}</version>

                <type>pom</type>

                <scope>import</scope>

            </dependency>

        </dependencies>

    </dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-configuration-processor</artifactId>

            <optional>true</optional>

        </dependency>

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

            <optional>true</optional>

        </dependency>

-----------------------------------------

//下面是作为工程的测试才引入的,开放jar给第三方则删除引入以及测试代码块,且删除一切启动该项目的配置信息等

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-tomcat</artifactId>

            <scope>provided</scope>

        </dependency>

        <dependency>

            <groupId>org.junit.jupiter</groupId>

            <artifactId>junit-jupiter</artifactId>

            <version>RELEASE</version>

            <scope>compile</scope>

        </dependency>

        <dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <scope>test</scope>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

    </dependencies>

</project>

​

 

目录

2 编写业务类 HelloService

@AllArgsConstructor

public class HelloService {

    private String name;

    public String info(){

        return "your info: " + name;

    }

}

 

3 添加属性封装类HelloProperties 

 

/**

 * @decription:

 * 属性封装类

 *  * >>要读取配置文件中的"hello.service.adjective"

 */

@ConfigurationProperties("hello.service") //属性前缀

@Data

public class HelloProperties {

    private String name;

}

4 配置类WorldServiceAutoConfiguration

@Configuration

@ConditionalOnClass(HelloService.class)

@EnableConfigurationProperties(HelloProperties.class)

public class HelloServiceAutoConfiguration {

    @Autowired

    private HelloProperties properties;



    @Bean

    @ConditionalOnProperty(name = "hello.service.enable", havingValue = "true")

    public HelloService worldService() {

        return new HelloService(properties.getName());

    }



    @Bean

    @ConditionalOnProperty(name = "hello.service.enable", havingValue = "false")

    public HelloService worldService1() {

        return new HelloService("z");

    }



    @Bean

    @ConditionalOnMissingBean

    public HelloService worldService2() {

        return new HelloService("vvv");

    }



    @Bean

    public ShareDemo getShareDemo(HelloProperties worldProperties) {

        ShareDemo shareDemo = new ShareDemo();

        shareDemo.setName(worldProperties.getName());

        return shareDemo;

    }



}

5 配置类注册spring.factories

在resources目录下新建META-INF/spring.factories文件,添加如下内容

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.foresealife.config.HelloServiceAutoConfiguration

6 可以先在该项目下进行测试,新建Test

@RunWith(SpringJUnit4ClassRunner.class// SpringJUnit支持,由此引入Spring-Test框架支持!

@SpringBootTest(classes = Application.class)

public class ServiceTest {

      

   

    @Test

    public void testdata(){

        System.out.println(worldService.info());

    }

若是要给第三方引用,则可以把application.properties以及单元测试、配置等、多余的pom、Application.java删除,然后验证一下第三方引入情况。

最后,maven打包,一个starter就算定义完成了,打包install后jar里面会多出META-INF/spring-configuration-metadata.json,是spring-boot-configuration-processor帮我们创建的ShareProperties元数据文件,凭借它的介绍,我们可以在application.xml中准确配置使用。
 

5 新建项目引入该依赖

1 使用idea创建项目,导入spring-boot-starter-web依赖,同时添加我们刚刚定义好的example-spring-boot-starter。

<dependency>

            <groupId>com.xxx</groupId>

            <artifactId>example-spring-boot-starter</artifactId>

            <version>1.0-SNAPSHOT</version>

        </dependency>

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-web</artifactId>

</dependency>

在application.properties

hello.service.name=ppppaaa
hello.service.enable=true

然后在单元测试引入,因为已经被自动化装配,因此可以直接注解引入

  @Autowired HelloService worldService;

@Autowired ShareDemo shareDemo;

参考手写一个starter – zomicc – 博客园


版权声明:本文为qiumen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qiumen/article/details/119417467