| --- | --- | --- |
| 更新日期 | 2022年05月05日 | 作 者 | 张留杨 |
| 保密等级 | C | 开放范围 | 研发测试部 |
版本历史
版 本 | 更新日期 | 作 者 | 备注 |
---|---|---|---|
1.0.0 | 2022年05月05日 | 张留杨 | 新建文档 |
支持功能
版本记录
使用示例
快速开始
引入依赖
<dependency>
<groupId>com.dindo</groupId>
<artifactId>auto-loader</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
配置文件
auto-loader:
# 默认基于注解扫描的策略绑定加载器
support: defaultAnnotationScanStrategyBindingLoader
# 默认基于数据库的策略绑定加载器
# support: defaultDatabaseStrategyBindingLoader
# 自定义策略绑定加载器
# support: customStrategyBindingLoader
特别说明:
策略提供
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);
}
}
注意:
开启配置
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";
}
}
注意:
开启配置
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);
}
评论区