如何自定义SpringBoot中的starter,并且使用它

目录

1 简介

2 规范

2.1 命名

2.2 模块划分

3  示例


1 简介

        SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁琐的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就自动扫描到要加载的信息并启动相应的默认配置,starter让我们摆脱了各种依赖库的处理,SpringBoot会自动通过classpath路径下的类发现需要的bean,并注册进IOC容器,SpringBoot提供了针对日常企业研发应用研发各种场景的spring-boot-starter依赖模块。

2 规范

2.1 命名

SpringBoot提供的starter以spring-boot-starter-xxx的方式命名,如mvc

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

而第三方默认自定义的starter使用xxx-spring-boot-starter的命名规则,以此来区分springBoot提供的starter,如mybatis。这也是约定大于配置的一种理念。

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>

2.2 模块划分

一个标准Spring boot Starter的组成:

autoconfigure模块:一般包含自动配置相关代码

starter模块:提供对autoconfigure模块的依赖以及其他的二方依赖,一般业务方通过依赖starter来实现这个组件的依赖

3  示例

功能:分每一个分配中国国籍

相关依赖:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.liubujun</groupId>
    <artifactId>learn-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>learn-spring-boot-starter</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
<!--        <plugins>-->
<!--            <plugin>-->
<!--                <groupId>org.springframework.boot</groupId>-->
<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
<!--            </plugin>-->
<!--        </plugins>-->
    </build>

</project>

第一个工程结构如下:

准备一个Service:

public interface UserService {

    String printUser(String name);
}

Service的实现类:

@Service
public class UserServiceImpl implements UserService {

    LearnProperties learnProperties;

    public UserServiceImpl(LearnProperties learnProperties) {
        this.learnProperties = learnProperties;
    }

    @Override
    public String printUser(String name) {
        return name+" is a citizen of "+learnProperties.getNationality();
    }
}

属性类:国籍从application.properties文件中获取

@ConfigurationProperties(prefix = "starter.user") //将配置文件中的相关属性与Java Bean进行动态绑定
@Data
public class LearnProperties {

    /**
     * 国籍
     */
    private String nationality;

}

配置类:

@Configuration
@EnableConfigurationProperties(LearnProperties.class) //让使用@ConfigurationProperties注解的类(LearnProper)生效
@ConditionalOnProperty(prefix = "starter",name = "isopen",havingValue = "true",matchIfMissing = true)
public class StarterAutoConfig {

    @Autowired
    LearnProperties learnProperties;

    @Bean
    UserService userService(){
        return new UserServiceImpl(learnProperties);
    }
}

//prefix为配置文件中的前缀,

//name为配置的名字

//havingValue是与配置的值对比值,当两个值相同返回true,配置类生效

添加文件工厂:spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.liubujun.learnspringbootstarter.config.StarterAutoConfig

以上是第一个工程配置完成之后进行打包:

 如此一个starter就制作完成了,那么如何使用它呢,可以想一想平时我们使用第三方依赖的时候是如何去使用它们的starter的,只需要在pom文件中引入该starter就好了。

此时准备第二个工程进行测试,工程结构如下:

步骤一:

在pom文件中引入上一个工程的依赖,如下:

        <!--自定义starter-->
        <dependency>
            <groupId>com.liubujun</groupId>
            <artifactId>learn-spring-boot-starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

 步骤二:

在配置文件中进行配置(此处的配置是根据引入上一个工程的依赖来进行配置的,就是第一个工程的属性类)

starter.user.nationality=the People's Republic of China
starter.isopen=true

步骤三:

建一个测试类

@RestController
@RequestMapping("test")
public class TestController {

    @Resource
    UserService userService;

    @GetMapping("test")
    public String testController(String name){
        return userService.printUser(name);
    }
}

测试结果如下:

 可以发现,引入了另外一个工程的starter之后,可以使用里面的相关代码,这也侧面印证了自己之前只引入依赖而没有思考是如何实现的。


版权声明:本文为qq_50652600原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>