• 自定义spring-boot-starter


    需求背景:

      Springboot是Spring旗下优秀的子项目之一,其核心理念之一:约定优于配置。通过自动化的配置极大的提升了我们的开发效率,目前已集成诸多组件的starter起步依赖,帮助我们更加快速的构建标准化的应用。

       starter作为springboot的一大特色,作为自动配置的核心组成,包括的优点如下:

        快速创建独立运行的Spring项目以及与主流框架集成;

        使用嵌入式的Servlet容器,应用无需打成WAR包;

        starters自动依赖与版本控制;

        大量的自动配置,简化开发,也可修改默认值;

        无需配置XML,无代码生成,开箱即用;

        准生产环境的运行时应用监控;

        与云计算的天然集成;

    Springboot支持自定义的starter,在开发过程中,我们若有一系列初始化配置需要在spring容器启动时完成初始化,此时我们可以把这批操作封装为一个starter,在目标项目中通过maven坐标引入。starter依赖于宿主项目的spring上下文环境,与我们传统方式在spring项目中注入bean不同,它本身可以独立开发,并打包引入到spring应用中。

    原理

       在springboot应用开发中,当我们在pom文件中引入starter组件依赖坐标时,启动Spring容器,此时应用会去依赖的Starter包中查找resources/META-INF/spring.factories文件,根据文件中配置去加载相应的自动配置类,类似于Java的SPI机制。简单的说自动配置是根据约定来的,也就是说springboot要求必须按照他给的规则开发starter才会帮你自动配置。
    大致思路:

      1.查找 spring.factories 中配置加载 AutoConfigure 类

      2.根据目标配置类的@Condition注解条件,将相应的配置bean注入到当前spring Context上下文环境中。也可以通过@EnableConfigurationProperties将指定配置类加载进来

    代码实现

    1.编写自己的starter,建立springboot项目,应用名demo-springboot-starter,添加maven坐标如下:

    <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-autoconfigure</artifactId>
    </dependency>

    2.编写Service

      主要实现该Starter主要实现的业务逻辑,这里是将配置文件中的配置加载进来,然后根据特定符号进行分割

    /**
     * 编写配置业务类
     *
     * @author jiayuan9608@163.com
     * @version 1.0.0
     * @date 2019/5/22 10:34
     */
    public class StarterService {
     
        private String config;
     
        public StarterService(String config) {
            this.config = config;
        }
     
        public String[] split(String separatorChar) {
            return StringUtils.split(this.config, separatorChar);
        }
    }

    3.配置文件读取类

    /**
     * 配置文件读取类
     *
     * @author jiayuan9608@163.com
     * @version 1.0.0
     * @date 2019/5/22 10:38
     */
    @ConfigurationProperties("cn.jyycode.service")
    @Data
    public class StarterServiceProperties {
     
        private String config;
    }

    4.编写AutoConfigure类,这是starter启动时加载spring.factories指定的启动配置类

    /**
     * Starter启动自动配置类
     *
     * @author jiayuan9608@163.com
     * @version 1.0.0
     * @date 2019/5/22 10:43
     */
    @Configuration
    @ConditionalOnClass(StarterService.class)
    @EnableConfigurationProperties(StarterServiceProperties.class)
    public class StarterAutoConfigure {
     
        @Autowired
        private StarterServiceProperties properties;
     
        @Bean
        @ConditionalOnMissingBean(StarterService.class)
        public StarterService starterService(){
            System.out.println("demo-spring-boot-starter run success:"+properties.getConfig());
            return new StarterService(properties.getConfig());
        }

    本类中使用了@Conditional注解,它是Spring4提供的一个新特性,用于根据特定条件来控制bean的创建行为。主要包括:

    @ConditionalOnBean:仅在当前上下文中存在某个bean时,才会实例化这个Bean 
    @ConditionalOnClass:某个class位于类路径上,才会实例化这个Bean  
    @ConditionalOnExpression:当表达式为true的时候,才会实例化这个Bean  
    @ConditionalOnJava:基于JVM版本作为判断条件  
    @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置  
    @ConditionalOnMissingBean:仅在当前上下文中不存在某个bean时,才会实例化这个Bean。  
    @ConditionalOnMissingClass:某个class在类路径上不存在的时候,才会实例化这个Bean。  
    @ConditionalOnNotWebApplication:不是web应用时才会实例化这个Bean  
    @ConditionalOnProperty:指定的属性是否有指定的值  
    @ConditionalOnResource:类路径下是否有指定的资源  
    @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean 
    @ConditionalOnWebApplication:当前项目是Web项目的条件下

      @AutoConfigureAfter,在某个bean完成自动配置后实例化这个bean。

      @AutoConfigureBefore,在某个bean完成自动配置前实例化这个bean

     

    5.在resources/META-INF/下创建spring.factoris文件,添加内容:(factories文件为k-v格式,v可以有多个,用 号分隔,v值根据自己的实际配置类路径)

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.jyycode.config.StarterAutoConfigure

    6.打包发布自己的Starter

      在idea或当前项目根目录下打开终端,执行mvn clean install -U,将项目打包并安装到本地maven仓库中去

    7.新建新项目demo,引入demo-springboot-starter坐标依赖

    <dependency>
         <groupId>cn.jyycode</groupId>
         <artifactId>demo-spring-boot-starter</artifactId>
         <version>0.0.1-SNAPSHOT</version>
    </dependency>

    8.有个小坑

      在starter项目进行maven打包时,注意在pom中插件添加如下配置:configuration.skip=true。否则在打包时会在class目录下生成BOOT-INF文件夹,导致spring.factories中配置的类无法找到,导致整个spring应用启动失败。

    <plugins>
        <plugin>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-maven-plugin</artifactId>
           <configuration>
               <skip>true</skip>
           </configuration>
         </plugin>
    </plugins>

    案例截图:(1)

     

     

     

     参考文档:(1)https://blog.csdn.net/iME_cho/article/details/105528208?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158927439419195239839421%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=158927439419195239839421&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2-105528208.nonecase&utm_term=%E8%87%AA%E5%AE%9A%E4%B9%89spring-boot-starter

    (2)https://blog.csdn.net/zhang_jiayuan/article/details/90543747?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%87%AA%E5%AE%9A%E4%B9%89spring-boot-starter&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-90543747

    (3)https://blog.csdn.net/yb223731/article/details/86524797?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%87%AA%E5%AE%9A%E4%B9%89spring-boot-starter&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-86524797

    (4)https://blog.csdn.net/wangpengzhi19891223/article/details/83055725?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%87%AA%E5%AE%9A%E4%B9%89spring-boot-starter&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-83055725

    kafka rabbitMq
  • 相关阅读:
    web中的安全编码
    网站安全(学习)
    head 命令(转)
    less 命令(转)
    简单网站优化
    Yahoo团队总结的关于网站性能优化的经验(转)
    more命令(转)
    linux安装oracle
    Ubuntu系统环境变量配置文件(转)
    nl命令(转)
  • 原文地址:https://www.cnblogs.com/stt101517/p/12889096.html
Copyright © 2020-2023  润新知