专栏首页SpringBoot 核心技术ApiBoot - ApiBoot Resource Load 使用文档

ApiBoot - ApiBoot Resource Load 使用文档

ApiBoot Resource Load

ApiBoot Resource Load是一款资源与业务完全分离的基础框架,可以整合微服务(Feign、OpenFeign)进行负载均衡读取固定类型、固定所属业务的资源信息,遵循一定的资源存储规则完成自动化资源读取、添加、更新、删除、缓存等。

使用场景

  • 业务图片存储
  • 业务音频、视频文件存储
  • 业务文件
  • 其他资源文件...

引入 ApiBoot Resource Load

pom.xml配置文件内添加如下依赖:

<!--ApiBoot Resource Load-->
<dependency>
  <groupId>org.minbox.framework</groupId>
  <artifactId>api-boot-starter-resource-load</artifactId>
</dependency>

ApiBoot所提供的依赖都不需要添加版本号,但是需要添加版本依赖,具体查看ApiBoot版本依赖

了解ApiBootResourceStoreDelegate

ApiBootResourceStoreDelegate是一个资源数据读取的委托驱动接口,在使用ApiBoot Resource Load时,需要实现该接口完成资源的读取方法loadResourceUrl(),该方法的参数如下所示:

  1. 第一个参数sourceFieldValue,是查询资源的业务编号,具体的配置详见下面的示例。
  2. 第二个参数resourceType,是查询资源的类型,相同的业务编号下很有可能存在多种类型,比如:用户编号对应用户头像、用户封面等。

ApiBootResourceStoreDelegate示例:

// 示例
@Service
public class ResourceLoadService implements ApiBootResourceStoreDelegate {
    /**
     * logger instance
     */
    static Logger logger = LoggerFactory.getLogger(ResourceLoadService.class);

    @Override
    public List<String> loadResourceUrl(String sourceFieldValue, String resourceType) throws ApiBootException {
        logger.info("查询资源的业务逻辑字段值:{}", sourceFieldValue);
        logger.info("资源类型:{}", resourceType);
        return Arrays.asList(new String[]{"http://test.oss.com/111.png"});
    }
}

loadResourceUrl方法需要返回根据resourceFieldValueresourceType字段查询到的资源列表。

内置注解

  • @ResourceLoad 标注方法需要进行ApiBoot Resource Load自动化读取资源信息,该注解必须添加,且只能添加在方法上。
  • @ResourceFields @ResourceField注解的集合
  • @ResourceField 配置@ResourceLoad标注的方法具体有哪些字段需要进行资源的自动映射,参数解释如下所示:
    • name:查询资源后设置到类内Field的名称
    • source:查询资源所需的业务逻辑编号类内Field的名称
    • type:资源类型,自行定义
    • isArray:接收查询后资源的Field类型是否为array,true:array
    • isList:接收查询后资源的Field类型是否为list,true:list

单对象资源加载

资源加载一般都是实体类的方式进行返回的,下面我们先来创建一个实体类方便示例测试,如下所示:

/**
  * 示例对象
  */
@Data
class SampleUserInfo {
  public SampleUserInfo(String userId, int age) {
    this.userId = userId;
    this.age = age;
  }

  private String userId;
  private String headImage;
  private String shortImage;
  private int age;
}

返回值为单对象资源加载示例:

/**
  * 返回值为单个对象的示例
  *
  * @return
  */
@ResourceLoad
@ResourceFields({
  @ResourceField(name = "headImage", source = "userId", type = "HEAD_IMAGE"),
  @ResourceField(name = "shortImage", source = "userId", type = "SHORT_IMAGE")
})
public SampleUserInfo singleObjectSample() {
  return new SampleUserInfo("yuqiyu", 24);
}

在上面,我们配置读取两种类型的资源,分别是:HEAD_IMAGESHORT_IMAGE,而且配置的业务资源编号都是userId字段,这两个字段也就是会传递给ApiBootResourceStoreDelegate#loadResourceUrl方法作为参数。 其中HEAD_IMAGE读取到的资源路径设置到SampleUserInfo类内的headImageSHORT_IMAGE读取到的资源路径设置到SampleUserInfo类内的shortImage字段。

注意:如果你的方法返回对象只有一个资源对象需要映射,可以单独配置使用@ResourceField注解。

List集合资源加载

/**
  * 返回值为list集合的示例
  *
  * @return
  */
@ResourceLoad
@ResourceFields({
  @ResourceField(name = "headImage", source = "userId", type = "HEAD_IMAGE"),
  @ResourceField(name = "shortImage", source = "userId", type = "SHORT_IMAGE")
})
public List<SampleUserInfo> listSample() {
  List<SampleUserInfo> users = new ArrayList();
  users.add(new SampleUserInfo("yuqiyu", 24));
  users.add(new SampleUserInfo("hengboy", 24));
  return users;
}

在上面,会为返回值list内的每一个SampleUserInfo对象进行设置查询的资源信息。

Map集合资源加载

/**
  * 返回值为map集合的示例
  *
  * @return
  */
@ResourceLoad
@ResourceFields({
  @ResourceField(name = "headImage", source = "userId", type = "HEAD_IMAGE"),
  @ResourceField(name = "shortImage", source = "userId", type = "SHORT_IMAGE")
})
public Map<String, SampleUserInfo> mapSample() {
  Map<String, SampleUserInfo> users = new HashMap<>(2);
  users.put("yuqiyu", new SampleUserInfo("yuqiyu", 24));
  users.put("hengboy", new SampleUserInfo("hengboy", 24));
  return users;
}

Map类型作为返回值时,其中注意map -> value必须是对象类型。

如果你有想要的使用方式,你就可以提交issuse!!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Arduino 中关于字符串的处理

    使用 += 运算符和 concat() 方法将(长)整数常量,(长)整数变量,字符,字符串添加到字符串中去,代码如下所示:

    caoqi95
  • JS the Hardcore: 执行上下文(Execution Context)

    是的,这样解释也可以,但是不够准确。如果仅仅理解到这个层面,而不把这里面涉及到的「执行上下文」(Execution Context, 下面简称 EC)这个概念弄...

    疯狂的技术宅
  • 软件设计原则

    软件设计一直是开发周期中最重要的阶段,在设计弹性和灵活的体系结构的花费的时间越多,在将来出现变更时就越节省时间。需求总是变化的,如果不定期添加或维护功能,软件将...

    疯狂的技术宅
  • 提高 | 10个JavaScript难点

    立即执行函数,即Immediately Invoked Function Expression (IIFE),正如它的名字,就是创建函数的同时立即执行。它没有绑...

    疯狂的技术宅
  • JavaScript专题之深浅拷贝

    如果是数组,我们可以利用数组的一些方法比如:slice、concat 返回一个新数组的特性来实现拷贝。

    疯狂的技术宅
  • 面向 JavaScript 开发人员的 ECMAScript 6 指南(3):JavaScript 中的类

    在 第 2 部分 中,您学习了 ECMAScript 6 中的函数增强,包括新的箭头和生成器函数。将函数元素集成到 JavaScript 代码中意味着要重新考虑...

    疯狂的技术宅
  • Python 与 MATLAB 的不同之处

    Python 是一门面向普遍需求的编程语言,而 MATLAB 主要是用来做数值计算的。所以,Python 的基本数据类型也和一般的编程语言一样普遍。但是,离开了...

    caoqi95
  • PRML读书笔记(3) - 深度理解机器学习之信息论(Information Theory)

    「总结自经典教材《Pattern Recognition and Machine Learning》以及김동국教授的人工神经网络纯理论课程。在此感谢作者及教授的...

    caoqi95
  • JavaScript中的with关键字

    原文:http://luopq.com/2016/02/14/js-with-keyword/

    疯狂的技术宅
  • JavaScript 类型的那些事

    JavaScript的类型判断是前端工程师们每天代码中必备的部分,每天肯定会写上个很多遍if (a === 'xxx')或if (typeof a === 'o...

    疯狂的技术宅

扫码关注云+社区

领取腾讯云代金券