自动装配实践,自己动手写一个springboot-starter

简介: 自动装配实践,自己动手写一个springboot-starter

一 前言

之前我们提到自动装配的定义是,尝试去装配class path下开发人员添加的jar依赖,不一定装配。这个是理论,而SpringBoot starter便是他的实现,理论需要落地,那就要自己动手写一个了。

二 实践

  1. 加载核心配置类

      /**
       * @author 子羽
       * @Description srping boot starter
       * @Date 2021/8/4
       */
      @Import(FormatAutoConfiguration.class)
      @Configuration
      @EnableConfigurationProperties(FormatProperties.class)
      public class QianYunFormatConfiguration {
          @Bean
          public ForTemplate helloFormatTemplate(FormatProperties formatProperties, FormatProcessor formatProcessor){
              if (formatProperties.getType().equals("fastjson")) {
                  return new ForTemplate(new FastJsonProcesser());
              }
    
              if (formatProperties.getType().equals("gson")) {
                  return new ForTemplate(new GsonFormatProcesser());
              }
              return new ForTemplate(formatProcessor);
          }
      }

2.@Import(FormatAutoConfiguration.class) 加载FormatAutoConfiguration.class

  
    /**
     * @author 子羽
     * @Description 条件装配 判断是否装配
     * @Date 2021/8/4
     */
    @Configuration
    public class FormatAutoConfiguration {

        @ConditionalOnClass(name = "com.alibaba.fastjson.JSON")
        @Bean
        @Primary
        public FormatProcessor fastjsonFormat(){
            return new FastJsonProcesser();
        }
        @ConditionalOnClass(name = "com.google.gson.Gson")
        @Bean
        public FormatProcessor gsonFormat(){
            return new GsonFormatProcesser();
        }
    }
  

注意 @Primary,他是在有多个实现时,选择的默认实现

  1. 获取配置

      
      **
       * @author 子羽
       * @Description ConfigurationProperties 作用和@Value差不多 就是多了通配符
       * @Date 2021/8/4
       */
      @ConfigurationProperties(prefix = FormatProperties.MY_PERFIX)
      public class FormatProperties {
    
          public static final String MY_PERFIX = "qianyu.format";
    
          private String type;
    
          public String getType() {
              return type;
          }
    
          public void setType(String type) {
              this.type = type;
          }
      }
  2. 创建抽象类

      /**
       * @author 子羽
       * @Description 格式化的方法
       * @Date 2021/8/3
       */
      public interface FormatProcessor {
    
      /**
       * 定义一个格式化的方法
       *
       * @param obj
       * @param <T>
       * @return
       */
      <T> String format(T obj);
      }
  3. 创建具体实现
    /**
     * @author 子羽
     * @Description FastJson
     * @Date 2021/8/3
     */
    @Component
    public class FastJsonProcesser implements FormatProcessor {
        public <T> String format(T obj) {
            return "fastJsonFormatProcess:" + JSON.toJSONString(obj);
        }
    }
    
    
    ```
    /**
     * @author 子羽
     * @Description Gson
     * @Date 2021/8/3
     */
    public class GsonFormatProcesser implements FormatProcessor {
        public <T> String format(T obj) {
            Gson gson = new Gson();
            return "GsonFormatProcesse" + gson.toJson(obj);
        }
    }
    ```
  1. 封装调用对象

    /**
     * @author 子羽
     * @Description 包含具体引用
     * @Date 2021/8/4
     */
    public class ForTemplate {
    
        private FormatProcessor formatProcessor;
    
        public ForTemplate(FormatProcessor formatProcessor) {
            this.formatProcessor = formatProcessor;
        }
    
        public <T> String format(T obj){
            return formatProcessor.format(obj);
        }
    }
  2. 编写spring.factories 放到META-INF目录下

    org.springframework.boot.autoconfigure.EnableAutoConfiguration = service.conf.QianYunFormatConfiguration
  3. mvn install打包 这样就完成了一个springbootstarter的编写
  4. 调用

    1) 引入maven依赖

    <dependency>
        <groupId>star</groupId>
        <artifactId>boot-star</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    2)配置文件增加配置,确定选择哪一个bean

    qianyu.format.type=gson

    3) 具体调用方法

    /**
     * @author 子羽
     * @Description 测试srpingbootstarter
     * @Date 2021/8/4
     */
    public class BootStarTest extends BaseTest {
    
        @Autowired
        public ForTemplate forTemplate;
    
        @Test
        public void formatTest(){
            User user = new User();
            user.setAge(18);
            user.setName("子羽");
            String format = forTemplate.format(user);
            System.out.println(format);
        }
    }

    输出
    GsonFormatProcesse{"name":"子羽","age":18},调用成功

相关文章
|
6月前
|
XML 安全 Java
深入实践springboot实战 蓄势待发 我不是雷锋 我是知识搬运工
springboot,说白了就是一个集合了功能的大类库,包括springMVC,spring,spring data,spring security等等,并且提供了很多和可以和其他常用框架,插件完美整合的接口(只能说是一些常用框架,基本在github上能排上名次的都有完美整合,但如果是自己写的一个框架就无法实现快速整合)。
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
6月前
|
Java 数据安全/隐私保护
Neo4j【付诸实践 01】SpringBoot集成报错org.neo4j.driver.exceptions.ClientException:服务器不支持此驱动程序支持的任何协议版本(解决+源代码)
Neo4j【付诸实践 01】SpringBoot集成报错org.neo4j.driver.exceptions.ClientException:服务器不支持此驱动程序支持的任何协议版本(解决+源代码)
321 1
|
2月前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
44 2
|
3月前
|
缓存 Java Spring
Java本地高性能缓存实践问题之在Spring Boot中启用缓存支持的问题如何解决
Java本地高性能缓存实践问题之在Spring Boot中启用缓存支持的问题如何解决
|
6月前
|
JavaScript Java 测试技术
返家乡”高校暑期社会实践微信小程序+springboot+vue.js附带文章和源代码设计说明文档ppt
返家乡”高校暑期社会实践微信小程序+springboot+vue.js附带文章和源代码设计说明文档ppt
38 0
|
6月前
|
Java API 时序数据库
InfluxData【付诸实践 02】SpringBoot 集成时序数据库 InfluxDB 应用分享(InfluxDB实例+Feign接口调用InfluxDB API)源码分享
InfluxData【付诸实践 02】SpringBoot 集成时序数据库 InfluxDB 应用分享(InfluxDB实例+Feign接口调用InfluxDB API)源码分享
163 0
|
JSON 前端开发 Java
【工作中问题解决实践 七】SpringBoot集成Jackson进行对象序列化和反序列化
【工作中问题解决实践 七】SpringBoot集成Jackson进行对象序列化和反序列化
424 0
|
弹性计算 Kubernetes 负载均衡
云原生之容器编排实践-以k8s的Service方式暴露SpringBoot服务
云原生之容器编排实践-以k8s的Service方式暴露SpringBoot服务
329 0
|
弹性计算 Kubernetes Cloud Native
云原生之容器编排实践-SpringBoot应用以Deployment方式部署到minikube以及弹性伸缩
云原生之容器编排实践-SpringBoot应用以Deployment方式部署到minikube以及弹性伸缩
243 0