zoukankan      html  css  js  c++  java
  • Spring Boot自动配置原理与实践(二)

    前言

      在之前的博文(Spring Boot自动配置原理与实践(一))中,已经介绍了Spring boot的自动配置的相关原理与概念,本篇主要是对自动配置的实践,即自定义Starter,对原理与概念加深理解。

      本篇是我在实际工作中配置的用于弱口令检查的Starter,能方便嵌入到用户模块中的相关密码接口或方法,对弱口令进行检查并反馈,当然由于是公司内部代码,部分代码省略。


    一、Starter实践

    1、配置Maven依赖

    Spring Boot自动化配置主要依赖如下两个包:

    • spring-boot-starter:打包starter主要依赖
    • configuration-processor:自动化配置主要依赖
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-configuration-processor</artifactId>
       <optional>true</optional>
    </dependency>

    2、创建实体类映射配置信息

    众所周知,SpringBoot Starter最厉害的就是可以通过最简单的properties/yaml文件配置,达到最终目的。配置文件需要通过解析生成对应的实体类

    @ConfigurationProperties(prefix = "weak.password")
    public class CheckWeakPasswordProperties {
    
        private Boolean enabled = true;
        /**
         * 需要检查的URI数组
         */
        private String[] checkUri;
        /**
         * 拦截检查的方式 1-interceptor 2-filter 3-aop
         */
        private Integer checkType = 1;
        private String ip = "127.0.0.1";
        private String port = "8501";
        /**
         * 客户端名称
         */
        private String clientName = "cloud-user";
        /**
         * 校验失败信息提示
         */
        private String failureMessage = "密码等级不够";
      
       ...// 省略getter/setter方法

    其中prefix = "weak.password",标明配置文件以“weak.password”开头的字段(对应实体类中的字段)都是需要解析的。在配置文件中输入前缀后,会进行提示说明

     

    3、定义配置类

    这一步非常关键,是自动装配的核心,通过配置文件配置灵活的参数产生相关的Bean,完成一系列初始化操作,关键的几个注解在这里就不解释了,具体可以看Spring Boot自动配置原理与实践(一)

    @Configuration
    @EnableConfigurationProperties(CheckWeakPasswordProperties.class)
    @ConditionalOnProperty(prefix = "weak.password", name = "enabled", havingValue = "true")
    public class CheckWeakPasswordAutoConfiguration {
    
        public CheckWeakPasswordAutoConfiguration() {
        }
    
        @Bean
        @ConditionalOnProperty(prefix = "weak.password", name = "checkType", havingValue = "2")
        public CheckPasswordInterceptor checkPasswordInterceptor(){
            return new CheckPasswordInterceptor();
        }
        @Bean
        @ConditionalOnProperty(prefix = "weak.password", name = "checkType", havingValue = "2")
        public CheckPasswordFilter checkPasswordFilter(){
            return new CheckPasswordFilter();
        }
        @Bean
        @ConditionalOnProperty(name = "weak.password.check-type", havingValue = "2")
        public CheckPasswordFilterConfig checkPasswordFilterConfig() {
            return new CheckPasswordFilterConfig();
        }
        @Bean
        @ConditionalOnProperty(prefix = "weak.password", name = "checkType", havingValue = "1")
        public CheckPasswordInterceptorConfig checkPasswordInterceptorConfig(){
            return new CheckPasswordInterceptorConfig();
        }
    
    }

    4、创建spring.factories文件

     之前三步所有的操作都已经完成,那么将Starter当引入工程中是如何发现并自动装配的,这就需要spring.factory文件中标明,在resource/META-INF在新建spring.factory文件

    在该文件中指明AutoConfiguration的全Class路径

    这样打包的时候就能将spring.factory文件打包,项目启动的时候就会扫描并装配

    同时生成spring-configuration-metadata.json文件,其内容就是提供配置文件智能化提示的

    {
      "groups": [
        {
          "name": "weak.password",
          "type": "com.yunchuang.password.properties.CheckWeakPasswordProperties",
          "sourceType": "com.yunchuang.password.properties.CheckWeakPasswordProperties"
        }
      ],
      "properties": [
        {
          "name": "weak.password.check-type",
          "type": "java.lang.Integer",
          "description": "拦截检查的方式 1-interceptor 2-filter 3-aop",
          "sourceType": "com.yunchuang.password.properties.CheckWeakPasswordProperties",
          "defaultValue": 1
        },
        {
          "name": "weak.password.check-uri",
          "type": "java.lang.String[]",
          "description": "需要检查的URI数组",
          "sourceType": "com.yunchuang.password.properties.CheckWeakPasswordProperties"
        },
        {
          "name": "weak.password.client-name",
          "type": "java.lang.String",
          "description": "客户端名称",
          "sourceType": "com.yunchuang.password.properties.CheckWeakPasswordProperties",
          "defaultValue": "cloud-user"
        },
        {
          "name": "weak.password.enabled",
          "type": "java.lang.Boolean",
          "sourceType": "com.yunchuang.password.properties.CheckWeakPasswordProperties",
          "defaultValue": true
        },
        {
          "name": "weak.password.failure-message",
          "type": "java.lang.String",
          "description": "校验失败信息提示",
          "sourceType": "com.yunchuang.password.properties.CheckWeakPasswordProperties",
          "defaultValue": "密码等级不够"
        },
        {
          "name": "weak.password.ip",
          "type": "java.lang.String",
          "sourceType": "com.yunchuang.password.properties.CheckWeakPasswordProperties",
          "defaultValue": "127.0.0.1"
        },
        {
          "name": "weak.password.port",
          "type": "java.lang.String",
          "sourceType": "com.yunchuang.password.properties.CheckWeakPasswordProperties",
          "defaultValue": "8501"
        }
      ],
      "hints": []
    }

    二、自定义Starter使用

    首先引入自定义的Starter包依赖到相关应用中

    然后在配置文件中打开开关,或者某些条件才能开启自动配置,以我的代码示例举例的话,就是需要指定enabled为true

    其次可以观察启动的时候相关的Bean是否被自动装配,可以打开debug模式查看日志,或者在idea中查看Endpoints-->Beans-->application,可以看到相关的自动配置启动时加载了,并且相应的Bean也注入了。

     最后就是验证是否符合业务逻辑

  • 相关阅读:
    linux 查看父进程号
    gitlab
    诺基亚C6常识详解
    C#.net书籍列表
    表链接
    Limu:JavaScript的那些书(转载)
    Oracle 多行记录合并/连接/聚合字符串的几种方法
    关于有锁iPhone的常识(转载)
    not in与not exists性能比较
    多表连接查询
  • 原文地址:https://www.cnblogs.com/jian0110/p/15152884.html
Copyright © 2011-2022 走看看