Java 生态中新兴的技术体系:

  • Spring Reactive → 背靠 Pivotal → 归属 VMware → 归属戴尔
  • Quarkus 和 Vert.x → 背靠 Eclipse 基金会 → 主要由 Red Hat 支持
  • Helidon → 背靠 Oracle
  • Micronaut → 背靠 Object Computing(Grails、OpenDDS)
  • Lagom → 背靠 Lightbend(Akka)

JDK(8和11)

下载

  1. # 下载-解压-建立链接
  2. tar zxvf openjdk-11_osx-x64_bin.tar.gz
  3. sudo ln -sfh /Library/Java/JavaVirtualMachines/jdk-11.jdk jdk-11.jdk

版本支持计划:https://www.oracle.com/java/technologies/java-se-support-roadmap.html
image.png

Http客户端

Feign

Retrofit

https://square.github.io/retrofit/
https://gitee.com/lianjiatech/retrofit-spring-boot-starter

Forest

http://forest.dtflyx.com/
针对第三方接口,所以不需要依赖Spring Cloud和任何注册中心

缓存

Caffeine

https://github.com/ben-manes/caffeine
常用配置

  • initialCapacity=[integer]: 初始的缓存空间大小
  • maximumSize=[long]: 缓存的最大条数
  • maximumWeight=[long]: 缓存的最大权重
  • expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
  • expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
  • refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
  • weakKeys: 打开key的弱引用
  • weakValues:打开value的弱引用
  • softValues:打开value的软引用
  • recordStats:开发统计功能

注意

  • expireAfterWrite和expireAfterAccess同事存在时,以expireAfterWrite为准。
  • maximumSize和maximumWeight不可以同时使用
  • weakValues和softValues不可以同时使用

    1. Caffeine<String, String> cache = Caffeine.newBuilder()
    2. // 数量上限
    3. .maximumSize(1024)
    4. // 过期机制
    5. .expireAfterWrite(5, TimeUnit.MINUTES)
    6. // 弱引用key
    7. .weakKeys()
    8. // 弱引用value
    9. .weakValues()
    10. // 剔除监听
    11. .removalListener((RemovalListener<String, String>) (key, value, cause) -> System.out
    12. .println("key:" + key + ", value:" + value + ", 删除原因:" + cause.toString()));
    13. AsyncLoadingCache<String, String> asyncLoadingCache = Caffeine.newBuilder()
    14. // 数量上限
    15. .maximumSize(2)
    16. // 失效时间
    17. .expireAfterWrite(5, TimeUnit.MINUTES).refreshAfterWrite(1, TimeUnit.MINUTES)
    18. // 异步加载机制
    19. .buildAsync(new CacheLoader<String, String>() {
    20. @Override
    21. public String load(@NonNull String key) throws Exception {
    22. // 获取待缓存数据
    23. return key;
    24. }
    25. });
    26. LoadingCache<String, String> loadingCache = Caffeine.newBuilder()
    27. // 数量上限
    28. .maximumSize(2)
    29. // 失效时间
    30. .expireAfterWrite(5, TimeUnit.MINUTES)
    31. //
    32. .refreshAfterWrite(1, TimeUnit.MINUTES)
    33. // 异步加载机制
    34. .build(new CacheLoader<String, String>() {
    35. @Override
    36. public String load(@NonNull String key) throws Exception {
    37. // 刷新获取待缓存数据
    38. return key;
    39. }
    40. });

加密解密

Password4j

https://github.com/Password4j/password4j
支持PBKDF2、Argon2、BCrypt、SCrypt

  1. <dependency>
  2. <groupId>com.password4j</groupId>
  3. <artifactId>password4j</artifactId>
  4. <version>1.5.2</version>
  5. </dependency>

常用工具类

Poi处理Excel

/**
     * 添加下拉选择
     * 
     * @param xssfWorkbook
     * @param xssfSheet
     * @param selectList
     *            待选择内容,长度不超过65535
     * @param cellList
     *            例如 new CellRangeAddressList(1, 755350, 0, 2);
     *            参数分别为:起始行、终止行、起始列、终止列
     */
    private static void addSelectRow(XSSFWorkbook xssfWorkbook, XSSFSheet xssfSheet, String[] selectList,
            CellRangeAddressList cellList) {
        int sheetTotal = xssfWorkbook.getNumberOfSheets();
        String hiddenSheetName = "hiddenSheet" + sheetTotal;
        XSSFSheet hiddenSheet = xssfWorkbook.createSheet(hiddenSheetName);
        Row row = null;
        // 写入下拉数据到新的sheet页中
        for (int i = 0, len = selectList.length; i < len; i++) {
            row = hiddenSheet.createRow(i);
            Cell cell = row.createCell(0);
            cell.setCellValue(selectList[i]);
        }
        // 获取新sheet页内容
        String strFormula = hiddenSheetName + "!$A$1:$A$65535"; // 定位到用来加载列的新的sheet页,后面则是A列的1-65535为有效性List条件
        XSSFDataValidationConstraint constraint = new XSSFDataValidationConstraint(
                DataValidationConstraint.ValidationType.LIST, strFormula);
        // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
        // 这里终止行建议不要过大,取Integer.MAX_VALUE 无效
        DataValidationHelper validationHelper = new XSSFDataValidationHelper(xssfSheet);
        DataValidation validation = validationHelper.createValidation(constraint, cellList);
        xssfSheet.addValidationData(validation);
        xssfWorkbook.setSheetHidden(sheetTotal, true);
    }

提取文本中的URL

    static final String        URL_REGEX        = "(https?|http)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]";
    static final Pattern    URL_PATTERN    = Pattern.compile(URL_REGEX);

    /**
     * 
     * @param text
     * @return 提取文本中的第一个URL
     */
    public static String findFirstUrl(String text) {
        Matcher matcher = URL_PATTERN.matcher(text);
        if (matcher.find()) {
            return matcher.group();
        }
        return null;
    }

    /**
     * 
     * @param text
     * @return 提取文本中全部URL
     */
    public static List<String> findUrl(String text) {
        Matcher matcher = URL_PATTERN.matcher(text);
        List<String> urlList = new ArrayList<>();
        while (matcher.find()) {
            urlList.add(matcher.group());
        }
        return urlList;
    }