侧边栏壁纸
博主头像
清如许博主等级

努力成长为一颗大树,一半洒落阴凉,一半沐浴阳光,非常沉默非常骄傲,从不依靠从不寻找

  • 累计撰写 80 篇文章
  • 累计创建 44 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

A005-自动加载-使用手册.md

清如许
2022-08-05 / 0 评论 / 0 点赞 / 8 阅读 / 1,811 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-08-05,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

| --- | --- | --- |
| 更新日期 | 2022年05月05日 | 作 者 | 张留杨 |
| 保密等级 | C | 开放范围 | 研发测试部 |

版本历史

版 本更新日期作 者备注
1.0.02022年05月05日张留杨新建文档

支持功能

  •  根据项目来自动加载所需策略实现
  •  自动配置功能
  •  提供基于注解的策略绑定加载器实现
  •  提供基于数据库的策略绑定加载器实现

版本记录

  • **1.0.0-SANPSHOT**

    提供基于数据库的策略绑定加载机制
    提供基于注解的策略绑定加载机制
    提供自动配置功能

使用示例

auto-loader-example

快速开始

引入依赖


<dependency>
  <groupId>com.dindo</groupId>
  <artifactId>auto-loader</artifactId>
  <version>1.0.0-SNAPSHOT</version>
</dependency>

配置文件

auto-loader:
	# 默认基于注解扫描的策略绑定加载器
  support: defaultAnnotationScanStrategyBindingLoader
  # 默认基于数据库的策略绑定加载器
  # support: defaultDatabaseStrategyBindingLoader
  # 自定义策略绑定加载器
  # support: customStrategyBindingLoader

特别说明:

  • 使用注解扫描加载器只需在代码中显式声明即可
  • 使用数据库加载器需要引入spring-boot-starter-jdbc mysql-connector-java依赖。

策略提供

com.dindo.StrategyBinding.provider.StrategyProvider
所有的具体使用策略使用StrategyProvider.apply方法获取。

/**
 * 应用
 *
 * @param projectId    项目标识
 * @param strategyType 策略类型
 * @return {@link T}
 */
public <T> T apply(String projectId, Class<T> strategyType);

基于注解加载器

创建接口类

package com.dindo.example.autoloader.spi.annotation;

/**
 * 简单打印spi
 *
 * @author zhangliuyang
 * @date 2022/04/29
 * @since 1.0.0
 */
public interface BasedOnAnnotationLoaderSpi {

    /**
     * 打印
     *
     * @param content 内容
     */
    void print(String content);

}

创建接口实现类策略一

package com.dindo.example.autoloader.spi.annotation.strategy;

import com.dindo.autoloader.annotation.StrategyBinding;
import com.dindo.example.autoloader.spi.annotation.BasedOnAnnotationLoaderSpi;
import org.springframework.stereotype.Component;

/**
 * 控制台打印策略
 *
 * @author zhangliuyang
 * @date 2022/04/29
 * @since 1.0.0
 */
@StrategyBinding({"2", "4", "6", "8", "10"})
@Component
public class ConsolePrintStrategy implements BasedOnAnnotationLoaderSpi {

    /**
     * 打印
     *
     * @param content 内容
     */
    @Override
    public void print(String content) {
        System.out.println(content);
    }

}

创建接口实现类策略二

package com.dindo.example.autoloader.spi.annotation.strategy;

import com.dindo.autoloader.annotation.StrategyBinding;
import com.dindo.example.autoloader.spi.annotation.BasedOnAnnotationLoaderSpi;
import com.dindo.plugin.core.lang.log.Logger;
import com.dindo.plugin.core.lang.log.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 日志打印策略
 *
 * @author zhangliuyang
 * @date 2022/04/29
 * @since 1.0.0
 */
@StrategyBinding({"1", "3", "5", "7", "9"})
@Component
public class LoggerPrintStrategy implements BasedOnAnnotationLoaderSpi {

   private static final Logger logger = LoggerFactory.getLogger(LoggerPrintStrategy.class);

    /**
     * 打印
     *
     * @param content 内容
     */
    @Override
    public void print(String content) {
        logger.info(content);
    }

}

注意:

  • 根据需求创建对应数量的接口实现策略类
  • 每个接口实现策略类上增加@Component@Service注解,或通过其它方式确保类被注册到Spring IOC容器中
  • 每个接口实现策略类上增加@StrategyBinding注解,value为对应项目标识,或其它用来获取对应策略的标记
  • @StrategyBinding注解value为数组,可配置多个,但注意同一接口下实现类不能配置相同

开启配置

auto-loader:
  support: defaultAnnotationScanStrategyBindingLoader

使用方式

import com.dindo.autoloader.provider.StrategyProvider;

@Resource
private StrategyProvider strategyProvider;


@GetMapping("test-annotation/{projectId}/{content}")
public String testAnnotationAutoLoader(@PathVariable("projectId") String projectId,
                                       @PathVariable("content") String content
) {
    BasedOnAnnotationLoaderSpi loaderSpi = strategyProvider.apply(projectId, BasedOnAnnotationLoaderSpi.class);
    loaderSpi.print(content);
  
    return "success";
}

基于数据库加载器

引入依赖

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-jdbc</artifactId>
		<version>2.2.12.RELEASE</version>
</dependency>

<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>8.0.22</version>
</dependency>

增加配置

spring:
  datasource:
    url: jdbc:mysql://192.168.88.199:3406/auto_loader?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
    username: root
    password: ddhlok.COM
    driver-class-name: com.mysql.cj.jdbc.Driver

创建接口类

package com.dindo.example.autoloader.spi.database;

/**
 * 基于数据库加载器spi
 *
 * @author zhangliuyang
 * @date 2022/04/29
 * @since 1.0.0
 */
public interface BasedOnDatabaseLoaderSpi {

    /**
     * 打印
     *
     * @param content 内容
     */
    void print(String content);

}

创建接口实现类策略一

package com.dindo.example.autoloader.spi.database.strategy;

import com.dindo.example.autoloader.spi.database.BasedOnDatabaseLoaderSpi;
import com.dindo.plugin.core.lang.log.Logger;
import com.dindo.plugin.core.lang.log.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 错误级别打印策略
 *
 * @author zhangliuyang
 * @date 2022/04/29
 * @since 1.0.0
 */
@Component
public class ErrorLevelPrintStrategy implements BasedOnDatabaseLoaderSpi {

    private static final Logger logger = LoggerFactory.getLogger(ErrorLevelPrintStrategy.class);

    /**
     * 打印
     *
     * @param content 内容
     */
    @Override
    public void print(String content) {
        logger.error(content);
    }

}

创建接口实现类策略二

package com.dindo.example.autoloader.spi.database.strategy;

import com.dindo.example.autoloader.spi.database.BasedOnDatabaseLoaderSpi;
import com.dindo.plugin.core.lang.log.Logger;
import com.dindo.plugin.core.lang.log.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 警告级别打印策略
 *
 * @author zhangliuyang
 * @date 2022/04/29
 * @since 1.0.0
 */
@Component
public class WarnLevelPrintStrategy implements BasedOnDatabaseLoaderSpi {

    private static final Logger logger = LoggerFactory.getLogger(WarnLevelPrintStrategy.class);

    /**
     * 打印
     *
     * @param content 内容
     */
    @Override
    public void print(String content) {
        logger.warn(content);
    }

}

注意:

  • 根据需求创建对应数量的接口实现策略类
  • 每个接口实现策略类上增加@Component@Service注解,或通过其它方式确保类被注册到SpringIOC容器中

开启配置

auto-loader:
  support: defaultDatabaseStrategyBindingLoader

使用方式

import com.dindo.autoloader.provider.StrategyProvider;

@Resource
private StrategyProvider strategyProvider;


@GetMapping("test-database/{projectId}/{content}")
public String testDatabaseAutoLoader(@PathVariable("projectId") String projectId,
                                     @PathVariable("content") String content
) {
    BasedOnDatabaseLoaderSpi loaderSpi = strategyProvider.apply(projectId, BasedOnDatabaseLoaderSpi.class);

    loaderSpi.print(content);

    return "success";
}

自定义加载器

实现策略绑定加载器接口

package com.dindo.example.autoloader.spi.custom;

import com.dindo.autoloader.load.StrategyBindingLoader;
import com.dindo.autoloader.model.StrategyBinding;
import com.dindo.example.autoloader.spi.custom.strategy.PrefixAppendStrategy;
import com.dindo.example.autoloader.spi.custom.strategy.SuffixAppendStrategy;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义策略绑定加载器
 *
 * @author zhangliuyang
 * @date 2022/04/29
 * @since 1.0.0
 */
@Component
public class CustomStrategyBindingLoader implements StrategyBindingLoader {

    /**
     * 加载
     *
     * @return {@link List}<{@link StrategyBinding}>
     */
    @Override
    public List<StrategyBinding> load() {
        List<StrategyBinding> strategyBindings = new ArrayList<>();

        int i = 0;
        while (i < 10) {
            i++;
            StrategyBinding strategyBinding = new StrategyBinding();
            strategyBinding.setClassName(BasedOnCustomLoaderSpi.class.getName());
            strategyBinding.setProjectId(String.valueOf(i));
            if (i % 2 == 0) {
                strategyBinding.setStrategyName(SuffixAppendStrategy.class.getName());
            } else {
                strategyBinding.setStrategyName(PrefixAppendStrategy.class.getName());
            }

            strategyBindings.add(strategyBinding);
        }


        return strategyBindings;
    }

}

注意:

  • 需要将自定义加载器注入到Spring IOC容器中
  • bean名称为customStrategyBindingLoader
  • 以上知识示例,只要确保return一个正确的List<StrategyBinding>数据即可

创建接口类

package com.dindo.example.autoloader.spi.custom;

/**
 * 基于自定义加载器spi
 *
 * @author zhangliuyang
 * @date 2022/04/29
 * @since 1.0.0
 */
public interface BasedOnCustomLoaderSpi {

    /**
     * 附加
     *
     * @param content 内容
     * @return {@link String}
     */
    String append(String content);

}

创建接口实现类策略一

package com.dindo.example.autoloader.spi.custom.strategy;

import com.dindo.example.autoloader.spi.custom.BasedOnCustomLoaderSpi;
import org.springframework.stereotype.Service;

/**
 * 前缀附加策略
 *
 * @author zhangliuyang
 * @date 2022/04/29
 * @since 1.0.0
 */
@Service
public class PrefixAppendStrategy implements BasedOnCustomLoaderSpi {

    /**
     * 附加
     *
     * @param content 内容
     * @return {@link String}
     */
    @Override
    public String append(String content) {
        return "prefix" + content;
    }

}

创建接口实现类策略二

package com.dindo.example.autoloader.spi.custom.strategy;

import com.dindo.example.autoloader.spi.custom.BasedOnCustomLoaderSpi;
import org.springframework.stereotype.Service;

/**
 * 后缀附加策略
 *
 * @author zhangliuyang
 * @date 2022/04/29
 * @since 1.0.0
 */
@Service
public class SuffixAppendStrategy implements BasedOnCustomLoaderSpi {

    /**
     * 附加
     *
     * @param content 内容
     * @return {@link String}
     */
    @Override
    public String append(String content) {
        return content + "suffix";
    }

}

注意:

  • 根据需求创建对应数量的接口实现策略类
  • 每个接口实现策略类上增加@Component@Service注解,或通过其它方式确保类被注册到SpringIOC容器中

开启配置

auto-loader:
  support: customStrategyBindingLoader

使用方式

import com.dindo.autoloader.provider.StrategyProvider;

@Resource
private StrategyProvider strategyProvider;


@GetMapping("test-custom/{projectId}/{content}")
public String testCustomAutoLoader(@PathVariable("projectId") String projectId,
                                   @PathVariable("content") String content
) {
    BasedOnCustomLoaderSpi loaderSpi = strategyProvider.apply(projectId, BasedOnCustomLoaderSpi.class);

    return loaderSpi.append(content);
}
0

评论区