自动装配实践,自己动手写一个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},调用成功

相关文章
|
2月前
|
Java 程序员 开发工具
Spring - SpringBoot入门之环境搭建
Spring - SpringBoot入门之环境搭建
27 0
|
10月前
|
JSON Java 数据格式
Spring Boot 学习研究笔记(十) -SpringBoot JAP 踩坑总结
Spring Boot 学习研究笔记(十) -SpringBoot JAP 踩坑总结
|
JSON 前端开发 NoSQL
看完这篇文章,你就是Spring/SpringBoot注解专家了(建议收藏!!! )2
看完这篇文章,你就是Spring/SpringBoot注解专家了
113 0
|
XML JSON 前端开发
看完这篇文章,你就是Spring/SpringBoot注解专家了(建议收藏!!! )1
看完这篇文章,你就是Spring/SpringBoot注解专家了
59 0
|
XML 存储 Java
SpringBoot入门到精通-Spring的注解编程(一)
SpringBoot入门到精通-Spring的注解编程
|
Java Spring
spring、springBoot笔记
spring、springBoot笔记
|
XML JSON Java
SpringBoot学习笔记-2:第二章 Spring Boot 配置
SpringBoot学习笔记-2:第二章 Spring Boot 配置
SpringBoot学习笔记-2:第二章 Spring Boot 配置
|
Java Spring 容器
SpringBoot学习笔记-2:第二章 Spring Boot 配置(2)
SpringBoot学习笔记-2:第二章 Spring Boot 配置
144 0
SpringBoot学习笔记-2:第二章 Spring Boot 配置(2)
|
XML 存储 开发框架
Spring实战入门教程,5天轻松掌握Spring框架
Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转(IoC)和面向切面编程(AOP)。Spring 是可以在 Java SE/EE 中使用的轻量级开源框架。
252 0
|
消息中间件 监控 前端开发
Spring常用框架之SpringBoot
从今天开始我会持续更新面试题,其中涵盖了:Java基础、多线程、IO、高并发、集合框架、数据库、框架以及分布式技术。持续更新中·······