一、创建starter的原理

在我们使用spring Boot的时候,常常要引入很多的starter,这也是spring Boot的一大特色,那么这些stater到底时怎么回事儿呢,今天就一起扒开看看

  1. 引入starter --- xxxAutoConfiguration --- 容器中放入组件 ---- 绑定xxxProperties ---- 配置项

  2. 点进某一个starter我们会发现,这玩意其实是个pom文件,里面指定了很多的依赖;这个东西叫做场景启动器,所谓的场景启动器呢,其实主要的作用就是引入依赖,声明我们这个场景下需要使用哪些jar包,以及里面都会引入一个自动配置包
  3. 而这个自动配置包就是我们starter的主要逻辑代码所在的部分了
  4. 所以我们在自定义starter的时候,也按照这个步骤来即可,即:

    yang-hello-spring-boot-starter(启动器)

    yang-hello-spring-boot-starter-autoconfigure(自动配置包)

二、自定义starter步骤

  1. 在创建自定义stater的时候,我们需要两个工程,第一个就是场景启动器,也就是xxx-spring-boot-stater;建个普通maven工程就可以了;在该项目中的pom文件中将自动配置包坐标引入,要是还需要其他的也可以引入

    <?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>
    
        <groupId>com.yang</groupId>
        <artifactId>yang-spring-boot-stater</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
        <dependencies>
            <!--引入自动配置包-->
            <dependency>
                <groupId>com.yang</groupId>
                <artifactId>yang-spring-boot-stater-autoconfigure</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    
    </project>

     2.之后,我们要准备自动配置包,需要创建一个springBoot项目,然后在pom文件中引入自己需要的依赖,建议引入spring-boot-configuration-processor这样其他项目使用配置的时候就由提示了

    3.创建一个bean即我们看到官方使用的xxxProperties,将其与配置文件绑定

    //指定配置文件的前缀
    @ConfigurationProperties(prefix = "yang.hello")
    @Data
    public class HelloProperties {
        private String prefix;
        private String suffix;
    
    }
    

    4.创建一个service,模拟业务代码逻辑,默认不要将其放入容器中,后面我们使用配置文件同一管理

    public class HelloService {
        //自动注入了实体类helloProperties,所以修改配置类的时候,属性就会跟着修改
        @Autowired
        HelloProperties helloProperties;
        public String hello(String username){
            return helloProperties.getPrefix()+username+helloProperties.getSuffix();
        }
    }
    

       5. 之后还要准备一个配置类,将service注入容器中(因为在第一步的service中我们不会将其                 注入容器);并且使用EnableConfigurationProperties注解,将实体类和配置文件的关联打              开以及注入容器;还可以使用ConditionOnMissingBean等注解,按照具体情况进行条件判断

/**
 * @ProjectName: com.yang.yangspringbootstaterautoconfigure.conf
 * @author: ZhangBiBo
 * @description: 配置类,打开实体类和properties的关联,并将其注入容器,当容器中没有helloService实体类的时候自动配置,若有就按照用户的来
 * @data: 2022/3/14
 */
@EnableConfigurationProperties(HelloProperties.class)
@Configuration
public class YangAutoConfiguration {

    @ConditionalOnMissingBean(HelloService.class)
    @Bean
    public HelloService helloService(){
        HelloService helloService = new HelloService();
        return helloService;
    }
}

6.最后需要在resource目录下建立一个META-INF目录,创建spring.faction文件,将我们的配置类     XXXAutoConfiguration类的类路径放入其中,这样在springBoot在启动时就可以加载到我们自定     义的配置类了,否则的话加载不到配置类,也就找不到文件了

 7.最后将场景启动器和自动配置包install就可使用;我们可以重新创建一个工程来进行测试,引入场景启动器,直接Autowired引入我们刚刚的HelloService即可,之后在application.yaml中配置好需要配置的文件

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐