# data-management-tool **Repository Path**: wanggn/data-management-tool ## Basic Information - **Project Name**: data-management-tool - **Description**: 基于spring组件的数据源管理工具,可简化多种同类数据源的操作,如多级缓存,使用该工具可大大简化工作流程,提供开发效率; - **Primary Language**: Java - **License**: Artistic-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-01-28 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # data-management-tool 使用文档 ## 简介 ### 描述: data-management-tool是依赖于spring组件的一个针对于数据源操作对象的管理工具; ### 版本: 1.1.1 ### 作者 huwei ### 联系方式: qq :3313749341 email : 3313749341@qq.com ### 运用场景: #### 1,数据源操作对象的管理 描述: 用户可根据需要从工具中获取需要的数据源操作对象; 使用: 将需要被管理的数据源类存放于某一包路径下,并为工具指定加载该包路径即可; #### 2,数据源层级调用 描述: 用户可定义一个数据操作的接口,并为该接口实现多个不同的数据的操作对象,如:操作内存的实现类、通过rcp调用的实现类、操作某一数据库的实现类等;然后,将该接口所在的包路径指定给工具,工具就将会从spring容器中获取到实现接口的所有的实例对象,并依据对象所定义的优先级排序,和依据定义的执行策略调用执行; 使用: - 定义数据源操作接口 - 创建接口的实现类 - 定义实现类的在执行队列中的优先级,《优先级定义》 - 将实现类加载到spring容器中; - 为工具指定接口的包路径(必须),数据源的执行策略(非必须),数据源执行优先级策略(非必须),数据源过滤策略(非必须) #### 3,多级缓存操作简化 描述: 对于多级缓存的简化操作,是在2上的一种运用;如:系统中需要使用本地缓存和redis缓存,可以定义一个缓存操作的接口,本地缓存和redis缓存都实现该接口,并通过自定义的执行策略或直接使用默认策略,对本地缓存和redis缓存进行统一的管理和调度; 使用: 参考2的使用方式; ## 使用 ### 使用须知 #### 1,spring组件依赖 工具必须依赖于spring组件才能正常工作,所以使用该工具的系统必须是基于或包含于spring组件的系统; 原因:工具的实现方式,是通过从spring容器中获取指定接口的实现实例对象来达到对对象的管理; #### 2, 工具的引入 ##### 2.1 jar包的方式 将项目文件中lib目录下的jar 引入项目中即可; 提示:如果最后打包整个项目时,使用maven的方式自动化编译打包,可能会出现jar无法找到的情况;所以推荐是用2.2的方式; ##### 2.2 maven的方式 步骤: - 新建目录,将工具的src源码目录和pom.xml 文件复制到目录中; - 使用mvn clean install package 命令将工具打包到本地maven仓库中; - 在项目中引入工具 maven引入 ```xml org.data.management.tool data-management-tool 1.1.1 ``` #### 3,工具的使用 声明工具的bean对象:工具使用org.huwei.data.manager.DataSourceManagerFacotry作为统一的入口类,即声明了该对象就完成了工具的引入工作; 声明示例: ```java @Configuration @PropertySource(value= {"classpath:config/properties/pro-datasource.properties"} ,encoding="utf8") public class RootConfig { @Value("${data.management.interfacePackageName}") private String dataSourcePath; @Bean public DataSourceManagerFacotry dataSourceManagerFacotry(ApplicationContext context) { return new DataSourceManagerFacotry(context ,dataSourcePath); } } ``` config/propertiest/pro-datasource.properties文件内容: ```xml data.management.interfacePackageName=com.huwei.data ``` com.huwei.data 包目录下定义有如图2个接口: ![1554360305960](C:/Users/Administrator/Desktop/zcg_temp/images/1554360305960.png) 使用示例: ```java @Service public class AuthenticationService { @Autowired private DataSourceManagerFacotry dataSourceManagerFacotry; public String loginPassword(UserAccount userAccount) { //通过DataSourceManagerFacotry对象获取AuthenticationDataSource接口的所有实现类的管理器 UserAccount oldUser = dataSourceManagerFacotry.getDataManager(AuthenticationDataSource.class).manager().findByUsername(userAccount.getUsername()); if(Objects.isNull(oldUser) || !MD5Util.valid(userAccount.getPassword(), oldUser.getPassword())) { return JsonResult.failed("用户名或密码错误" ,ResultErrorConstant.USER_OR_PASSWORD_ERROR); } if(oldUser.getStatus() > 1) { return JsonResult.failed("账户异常,请联系管理员" ,ResultErrorConstant.USER_OR_PASSWORD_ERROR); } return loginSuccessful(oldUser); } ``` AuthenticationDataSource 的实现类展示: ![1554360782824](C:/Users/Administrator/Desktop/zcg_temp/images/1554360782824.png) ## api使用 ### 1,详细api文档 请求参考《src/main/doc/api》的api文档; ### 2,优先级定义 #### 2.1 约定: - 优先级使用正整数值表示,数值越小表示优先级越高,具体到其表现形式为:在数据源操作队列中,数值越小的对象排列位置越靠近队列的头部位置; - org.springframework.core.annotation.Order 方式所定义的优先级高于org.huwei.data.manager.DataSourceOrderProperites 接口方式定义的优先级; - 定义在实例对象类类型上的org.springframework.core.annotation.Order所表示的优先级高于定义在实例对象实现接口的org.springframework.core.annotation.Order优先级; #### 2.2 使用 ##### 2.2.1 org.springframework.core.annotation.Order 注解 在数据源的类上定义Order注解,并设定其值即可; 问题: 需要注意被spring动态代理的对象,使用Order注解的方式,工具将不能正确获取到Order注解所定义的优先级;如:spring缓存对象(使用@Cacheable注解的对象)、jpa所动态生成的对象; 解决: - 如果该数据源类有依赖的接口,可在其接口上定义默认优先级,则工具将最终获取到接口所定义的优先级; - 实现org.huwei.data.manager.DataSourceOrderProperites 接口的方式,参考《api使用2.2.2》 ##### 2.2.2 org.huwei.data.manager.DataSourceOrderProperites 接口 实现org.huwei.data.manager.DataSourceOrderProperites 接口,并在实例化org.huwei.data.manager.DataSourceManagerFacotry对象时,将将实现类指定给DataSourceManagerFacotry对象即可; ### 3,数据源过滤策略 #### 3.1 约定: 工具提供默认的过滤策略,即是:定义有org.huwei.data.manager.Filter注解的数据源将被过滤; #### 3.2 自定义过滤策略 org.huwei.data.manager.DataSourceFilter接口,并在实例化org.huwei.data.manager.DataSourceManagerFacotry对象时,将将实现类指定给DataSourceManagerFacotry对象即可; ### 4,数据源的执行策略 #### 4.1 约定: 工具提供默认的数据源执行策略,其执行逻辑是: - 从可操作的数据源队列的头部依次执行; - 如果某一数据源在方法的执行中返回不为空的结果,则后续数据源将不在执行,并返回结果; - 判断当前需要被执行的数据源方法是否已被执行,如果是,则不在执行该数据源的该方法; - 方法退出时:清空当前数据源的当前方法的调用记录;其目的是,当前方法当次执行已经全部执行完毕,记录方法调用记录已无作用,且会影响下一次调用; #### 4.2 自定义执行策略: org.huwei.data.manager.DataSourceManagementStrategy接口,并在实例化org.huwei.data.manager.DataSourceManagerFacotry对象时,将将实现类指定给DataSourceManagerFacotry对象即可; 提示: ​ 注意在退出当前方法时,清空当前方法的调用记录,否则将影响下一次的方法执行; ### 5,工具类DataSourceUtil的使用 #### 5.1 约定: - DataSourceUtil工具应该只给被加入到工具管理的数据源的类的方法中使用,否则将不能够得到正确的结果 - DataSourceUtil工具需要再org.huwei.data.manager.DataSourceManagerFacotry被实例化之后才能得到正确的结果; #### 5.2 原理: org.huwei.data.manager.DataSourceManagerFacotry在实例化时,会将被管理的对象通过DataSourceUtil的静态方法addManager(Map) ,添加到DataSourceUtil工具中; ​