• ThingsBoard 二次开发之源码分析 1- 基础知识


    thingsboard聚集地

    Thingsboard 话题讨论区:https://forum.iotschool.com/topics/node8

    欢迎大家加入thingsboard 二次开发讨论群:121202538

    thingsboard交流QQ群 121202538

    ThingsBoard源码分析1-基础知识

    预备知识

    • JDK1.8

    • 注解

    • Protobuf

    • Guava

    JDK1.8

    • Lambda表达式

    • 方法引用

      方法引用的唯一用途是支持Lambda表达式的简写,调用方法的时候使用::, 对于一些单个参数,可以自动推断;

    • Consumer

      Consumer的作用是给定义一个参数,对其进行(消费)处理,处理的方式可以是任意操作,无返回值;

    • Predicate

      断言接口,根据传入的Lambda表达式返回boolean;

    • Supplier

      根据提供的Lambda表达式返回需要的对象;

    • Function

      函数式编程接口,根据提供的Lambda表达式进行相应的操作并返回结果;

    注解

    • @PostConstruct

      @postConstruct 注解并非为spring提供, 该注解用来修饰非静态void()方法,该注解的执行时机为在对象加载完依赖注入后执行,即Constructor > @Autowired > @postConstruct;

    • @EventListener

      由spring提供,spring为我们提供了事件的监听与实现,内部的实现原理是观察者设计模式,实现了系统解耦,时间发布者不需要考虑谁在监听,发布者只关心自己消息的发布;

    • @Conditional及包括其子注解

      spring提供,对满足条件进行注入;

    • @Builder

      lombok插件提供,目的是简化构造者模式的代码。Builder Pattern可轻松创建复杂对象;

    Protobuf

    protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。相比JSON,XML占用内存小,解析速度更快。在使用过程中,首先创建xx.proto文件,通过protobuf-maven-plugin创建相应的类。

    Guava

    Guava 是一组来自谷歌的核心Java库,其中包括新的集合类型、不可变集合、一个图库,以及用于并发、I/O、散列、缓存、原语、字符串等的实用工具。

    • ListenalbeFuture

      ListenalbeFuture是对JDK的future进行增强,可以监听任务的执行状况:

      1. 使用MoreExecutors创建线程池

        ListeningExecutorService  executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
        
      2. 提交任务

         final ListenableFuture<Integer> listenableFuture = executorService.submit(new Callable<Integer>() {
                    public Integer call() throws Exception {
                        System.out.println("call execute..");
                        TimeUnit.SECONDS.sleep(3);
                        return 7;
                    }
                });
        
      3. 添加监听任务执行状态①

        		listenableFuture.addListener(()->{
                    try {
                        System.out.println(listenableFuture.get());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    }
                },executorService);
        
      4. 添加监听任务执行状态②

          Futures.addCallback(listenableFuture, new FutureCallback<Integer>() {
                    @Override
                    public void onSuccess(@Nullable Integer integer) {
        						//返回future的执行结果
                    }
                    @Override
                    public void onFailure(Throwable throwable) {
        
                    }
                }, executorService);
        
    • Futures.transform

      如果需要对返回值做处理,可以使用Futures.transform方法,它是同步方法,另外还有一个异步方法Futures.transformAsync:

      			ListenableFuture<String> future = executorService.submit(() -> "hello, future");
            ListenableFuture<Integer> future2 = Futures.transform(future2, String::length, executorService);
           //future2返回的是’hello, future‘的长度
      
    • SettableFuture

      SettableFuture可以认为是一种异步转同步工具,可以它在指定时间内获取ListenableFuture的计算结果:

      SettableFuture<Integer> settableFuture = SettableFuture.create();
      ListenableFuture<Integer> future11 = executorService.submit(() -> {
          int sum = 5 + 6;
          settableFuture.set(sum);
          return sum;
      });
      // get设置超时时间 
      System.out.println(settableFuture.get(2, TimeUnit.SECONDS));
      
  • 相关阅读:
    使用video2chars将视频转字符图
    Android调用打印机
    WPF多线程UI更新
    设计模式在JDK中的应用
    23种设计模式(概念、原则、场景、优点、缺点、应用)简述
    Bridge 、 Adapter 和 Facade 的区别
    UML类图与类的关系详解
    uml 类图依赖与关联的区别
    UML类图几种”关系“的总结
    面试官问你有什么要问的时候,大胆的提出类似问题
  • 原文地址:https://www.cnblogs.com/iotschool/p/13758335.html
Copyright © 2020-2023  润新知