手写spring-boot-start

在手写start之前,先思考下三个点:

1. 回忆了解下Springboot装载过程

2. 编写spring-boot-start的目的

3. 编写spring-boot-start的步骤

SpringBoot装载过程

装载过程,我们从两个点出发:

        1. SpringApplication.run()方法(应该很熟悉)

        2. @SpringBootApplication

源码的分析网上有很多,总结一张思路图如下:

编写spring-boot-start的目的

通俗的理解:1. 承上启下,即对原有的常用中间件的常见配置,进行通用配置、包装、扩展等封装配置,已达到下层服务使用更加方便(eg: DB、MQ多数据源支持等)。2. 编写符合多种业务的通用组件进行包装,以便下层更好的使用。(eg:sharding-jdbc-spring-boot-starter、mybatis-plus-boot-starter,以及SpringBoot常用的jdbc\redis等中间件start包等等)

编写spring-boot-start的步骤

1. 编写会用到的Properties类

@Data
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {

  private boolean enableHello;

  private String msg;

  private int count;

  private List<Person> personList;

  @Data
  public static class Person{

    private String name;

    private int sex;

    private int age;

  }

}

2. 编写配置类(自动装载)

@Configuration
@ConditionalOnWebApplication
@EnableConfigurationProperties(HelloProperties.class)
public class HelloAutoConfigure {

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

}

3. 编写spring.factories(/resource/META-INF/spring.factories)

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.rhb.boot.autoconfigure.HelloAutoConfigure

4. 编写元数据文档spring-configuration-metadata.json(同3)

{
  "hints":[{
    "name":"hello.msg",
    "values":[{
      "value":"你好",
      "description":"中文方式打招呼"
    },{
      "value":"Hi",
      "description":"英文方式打招呼"
    }]
  }],
  "groups":[
    {
      "sourceType": "com.rhb.boot.prop.HelloProperties",
      "name": "hello",
      "type": "com.rhb.boot.prop.HelloProperties"
    }],
  "properties":[
    {
      "sourceType": "com.rhb.boot.prop.HelloProperties",
      "name": "hello.msg",
      "type": "java.lang.String",
      "description": "打招呼的内容",
      "defaultValue": "Worlds"
    }]
}

pom文件

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
  </parent>

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

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

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.18</version>
      <scope>provided</scope>
    </dependency>

  </dependencies>
注解作用
@ConditionalOnBean当容器中有指定的Bean的条件下
@ConditionalOnMissingBean当容器中没有指定Bean的情况下
@ConditionalOnClass当类路径下有指定的类的条件下
@ConditionalOnMissingClass当类路径下没有指定的类的条件下
@ConditionalOnWebApplication当前项目是Web项目的条件下
@ConditionalOnNotWebApplication当前项目不是Web项目的条件下
@ConditionalOnJndi在JNDI存在的条件下查找指定的位
@ConditionalOnJava基于JVM版本作为判断条件
@ConditionalOnExpression基于SpEL表达式作为判断条件
@ConditionalOnResource类路径下是否有指定的资源
@ConditionalOnSingleCandidate当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean
@ConditionalOnProperty指定的属性是否有指定的值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值