目录

沈超琦的个人博客

Stay Foolish,Stay Hungry

Hello World 置顶!

记录生活,记录成长,记录美好 想说的有很多,但都说不出来了.贴上一段代码和一句话,希望自己不负韶华吧. public static void main(String[] args){ System.out.println("Hello World!"); } “终其一生,我们只为寻找最初失去的那个人” ——胡塞尼《群山回唱》

世界,你好!

Solo 博客系统已经初始化完毕,可在管理后台 - 工具 - 偏好设定中调整更多细节设置。如果需要导入已有博客文章,请参考文档 Solo 支持 Hexo/Jekyll 数据导入。 对了,出于安全考虑请尽快完成如下操作: 登录链滴社区后,在个人设置 - B3 中更新 B3 Key 在 Solo 管理后台 - 工具 - 用户管理中也进行同样的 B3 Key 更新 另外,如果你需要开启评论系统,请参考 Solo 集成 Gitalk 评论系统。 最后,如果你觉得 Solo 很赞的话,请到项目主页 Watch、Star、Fork 三连 😍

Day03-ApacheCamel的架构介绍

Camel in action2 学习笔记 什么是camel ** 从头开始构建复杂的系统是一项代价高昂的工作,而且几乎很难成功。 一种有效且风险较小的替代方案是从现有的、经过验证的组件组装一个像拼图游戏一样的系统。 我们每天都依赖于大量这样的集成系统,这让电话通信、金融交易和医疗保健到旅行计划和娱乐的一切成为可能。一个好的集成框架为您正在集成的复杂系统提供简单、可管理的抽象,以及将它们无缝连接在一起的“粘合剂”。** ** Apache Camel 就是这样一个集成框架。 我将帮助您了解 Camel 是什么、如何使用它以及为什么我们认为它是最好的集成框架之一。首先介绍 Camel 并突出显示它的一些核心功能。 然后我们将展示骆驼分发并解释如何运行 Camel 示例书。 我们将通过引入核心 Camel 来结束本章将概念放到表格中,以便您了解 Camel 的建筑学。 ****你准备好了吗? 让我们认识骆驼。 ** 1.1 ** **Camel 是一个集成框架,旨在使您的集成项目富有成效和乐趣。 骆驼项目是2007年初开始,现在是一个成熟的开源项目,在自由的 Apache 2 许可下可....

Day02-ApacheCamel简介 有更新!

camel分享.pdf.zip

我在 GitHub 上的开源项目

LinkCloudDisk Java ⭐️15  🖖7 基于springcloud开发的分布式美剧订阅系统(含爬虫) 2. linkjb Vue ⭐️6  🖖1  🏠http://www.linkjb.com 基于spring,vue开发的在线实时交友网站 3. echarts-gl JavaScript ⭐️1  🖖0 Extension pack of ECharts providing globe visualization and 3D plots 4. LinkDisk Java ⭐️1  🖖0 基于分布式的在线云盘 balabala 5. pachong Java ⭐️1  🖖1 基于java-jsoup的爬虫项目,爬取链家 6. subscription Java ⭐️1  🖖0 通过JSOUP爬取相关网页获取最新美剧,热门电影的bt种子并通过微信公众号的形式推送给订阅了相关资源的用户 7. chaoc....

Spring方法注入 @Lookup注解使用

情景分析 在Spring的诸多应用场景中bean都是单例形式,当一个单例bean需要和一个非单例bean组合使用或者一个非单例bean和另一个非单例bean组合使用时,我们通常都是将依赖以属性的方式放到bean中来引用,然后以@Autowired来标记需要注入的属性。但是这种方式在bean的生命周期不同时将会出现很明显的问题,假设单例bean A需要一个非单例bean B(原型),我们在A中注入bean B,每次调用bean A中的方法时都会用到bean B,我们知道Spring Ioc容器只在容器初始化时执行一次,也就是bean A中的依赖bean B只有一次注入的机会,但是实际上bean B我们需要的是每次调用方法时都获取一个新的对象(原型)所以问题明显就是:我们需要bean B是一个原型bean,而事实上bean B的依赖只注入了一次变成了事实上的单例bean。 代码说明 ** @Component @Scope("prototype") public class PrototypeBean { private static final Logger logger= Lo....

(原创)XML与父子结构树互转

前言 最近在做的一个项目是要做模板化数据的生成,需要做一些数据的标准化,需要对XML文档进行结构化存储,以及从结构化数据转化为XML(freemark模板) XML转数据库存储 实体类代码 package com.linkjb.fastidious.util; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import org.dom4j.Attribute; import java.util.List; /** * @ClassName Node * @Description TODO * @Author shark * @Data 2020/12/2 14:59 **/ ....

Java8常用Lambda表达式

1、表结构 package com.example.demo; import lombok.Data; import java.math.BigDecimal; @Data public class User { private Long id; private int age; private String name; private BigDecimal money; private String department; } 2、方法 List<User> list = this.findAll(); // 获取id的集合 其他字段获取类似 getId换成想要的字段名即可 List<Long> ids = list.stream().map(User::getId).collect(Collectors.toList()); // 返回年龄最大的用户是多少岁 注意:实体类中是int 这边是Integer接的 Integer biggestAge = list.stream().map(User::getAge).max(Integer::compare)......

JVM内存结构(基于JDK8)

根据VM规范,VM应该被划分为五块区域——即VM栈、堆、方法区、程序计数器、本地方法栈五个部分。如下图所示: 方法区(Method Area):该区域是所有线程共享的,主要用于存放类的信息,常量、静态变量、即时编译器编译后的代码等。垃圾回收器对这块区域的回收主要是针对常量池和类的卸载。 java堆(Java Heap):该区域也是所有线程共享的,用于存放对象实例,绝大多数创建的对象都会被存放到这里(除了部分由于逃逸分析而在对外分配的对象,该部分只是在方法体被引用,故被分配到了栈上)。垃圾回收器最主要针对的对象,对这部分的回收效率影响了VM的整体性能。 本地方法栈(Native Methiod Stack):该区域是每个线程锁独有的,主要用于VM的Native方法。这部分是有VM自行管理,程序员基本上不需要关系该部分。 VM栈(VM Stack):该区域也是每个线程所独有的,与本地方法栈是类似的,唯一的区别是它为VM执行Java方法服务。该区域主要维护栈针(每调用一个方法,则VM就会创建一个栈针保护当前方法的状态,并将其压入栈中,当被调用的方法完成后,在将其出栈继续执行未完成的方法),.....

杂谈JVM

Jvm学习总结 序 jvm之运行时内存 jvm之对象的一生 jvm之天道的发展 jvm之大并发时代 结 序 为了防止自己学完就忘记,写此博客. jvm之运行时内存 jvm的运行时内存,是学习jvm一个不错的切入点,在此一一列出: 1.虚拟机栈: 一千个人眼中有一千个哈姆雷特,一千个线程有一千个虚拟机栈,在操作系统层面看的话,用户级线程便是分着不同的栈去执行的,既然操作系统老大哥都这样,jvm的线程肯定也是一个线程一个栈了.一个虚拟机栈中又有什么呢,看看老大哥的栈中,是一个一个的栈帧,jvm自然也是栈帧了(栈帧即方法).除了栈帧,jvm还有一个小的可以忽略的程序计数器(程序计数器记录每个线程运行的位置,方便线程的切换),操作系统拥有着tcb(ThreadControllerTable),可以记录自己运行到哪儿了,所以不需要程序计数器.因此就没有这个概念了吧.那么栈帧里面又是什么呢,这里面jvm就分的很细致了,操作数栈,局部变量表,动态链接,返回地址. 操作数栈是个啥呢?操作系统中,根据指令,将需要操作的数据放入寄存器组中,之后运算出来,运算中途的数据存入寄存器里面暂存,最后要....

JAVA中关于static的继承问题

//父类 public class Father { public static String staticString="父类中的静态变量"; public String str="父类中的非静态变量"; public static void staticMethod(){ System.out.println("父类中的静态方法"); } public void nostaticMethod() { System.out.println("父类中的非静态方法"); } } //子类 public class Son extends Father { public static String staticString="子类中的静态变量"; public String str="子类中的非静态变量"; public static void staticMethod(){ System.out.println("子类中的静态方法"); } public void nostaticMethod() { System.out.println("子类中的非静态方法"); } } //子类 p....

关于for丶foreach丶iterator 迭代器

关于for丶foreach丶iterator 迭代器 1 前言: 我们在网上或者在讨论的时候往往会有这么一种说法:foreach 也是迭代器的一类,底层实现的是迭代器。但是这种说法并不严谨,也可以说这种说法对于我们正常的理解来说并不是能够完全理解。 2 结论: for 丶 foreach 丶迭代器 这三个遍历方法中 不应该将他们三种遍历方法归在一起 而是将其分成三类)——不要将foreach 归为迭代器的一种遍历 (我们一步一步来,首先来简单介绍一下这是那种方法的区别) 3 多态差别 for和foreach都需要知道自己的集合类型,甚至要知道自己集合内的元素类型,不能实现多态。( public static void main(String[] args) { int[] ints = new int[]{1, 2, 3, 4}; int[] var2 = ints; int var3 = ints.length;for(int var4 = 0; var4 < var3; ++var4) { int i = var2[var4]; System.out.println(i); ....

Groovy脚本语言分享

1 Groovy与JAVA的区别 Groovy语言一直在努力亲近Java开发人员。在设计Groovy语言的时候,我们遵循最小标新立异原则,努力让那些Java开发背景的开发者容易上手并学会。下面我们列举Groovy和Java的一些主要区别。 1 默认导入 下面的包和类是默认导入的,也就是说不必精确使用 import 语句来导入它们: java.io.* java.lang.* java.math.BigDecimal java.math.BigInteger java.net.* java.util.* groovy.lang.* groovy.util.* 2 动态方法(Multi-methods) 在Groovy里,方法的调用是在运行时动态决定。这一特性叫做运行时分发(runtime dispatch)或动态方法(multi-methods)。也就是说方法的最后调用是根据传入参数在运行时的类型所决定。在Java里,这一点是不一样的:在编译时就决定了方法的参数类型。 下面的代码,我们采用Java风格,在Groovy和Java都可以编译通过,但是运行结果不一样: int method......

Groovy基础语法

一、环境搭建 安装好JDK环境 到groovy官网下载groovySDK,解压到合适位置 groovy官网:http://www.groovy-lang.org/ 安装后的文件如上图所示,我们需要关注的是bin和doc文件夹下的内容,其它文件夹下是一些配置和groovy自带的一些jar包 配置groovy环境变量 二、与Java的不同之处 1、默认 imports 所有这些包和类都是默认导入的,您不必使用显式import语句来使用它们: ** java.io.* java.lang.* java.math.BigDecimal java.math.BigInteger java.net.* java.util.* groovy.lang.* groovy.util.* 2、运行时分派 在Groovy中,将在运行时选择将被调用的方法。 这称为运行时分派或Multi-methods。 这意味着将基于运行时参数的类型来选择方法。 在Java中,则是根据声明的类型,在编译时选择方法。 下面的代码,以Java代码编写,可以在Java和Groovy中编译,但它的行为会有所不同:....

有感

《 丑奴儿·书博山道中壁 》 辛弃疾 少年不识愁滋味,爱上层楼。 爱上层楼,为赋新词强说愁。 而今识尽愁滋味,欲说还休。 欲说还休,却道天凉好个秋。

使用流处理数据后导致PageInfo的total属性得到的值等于当前页记录数size

问题: 使用PageHelper分页助手,以往总记录数通过 pageInfo.getTotal()获取都没有问题。这次做了个商品列表分页,发现 total等于当前页的数量,相当于 size了。而后台SQL确实查询出了所有的数据。 原因: 爬了几篇文后,总结一下。 total属性确实是总记录数,并不是有些文章里说的当前页数。 其实解答还是在Github作者的Issues中: https://github.com/pagehelper/pagehelper-spring-boot/issues/21 针对我个人问题的原因就是作者最后说的这一句,别的可能存在的原因可以去看完整的issues里的讨论。 因为我在查询后又使用了lambda的stream()对数据进行了处理。 作者说lambda处理过后的流会丢失分页信息,所以导致数据只显示了默认的当前页的数量。

数据结构-嵌套集模型

这段时间被嵌套集模型折磨得快疯了,当初技术选型的时候没有选择最稳的父子树结构,而是想试试另外的数据结构(选了嵌套集),结果没想到后来产品的骚需求一个一个来,原来的官方Demo已经满足不了需求,只能自己写做逻辑,顺便再温习一下这个数据结构 概述 我们知道,关系数据库的表更适合扁平的列表,而不是像 XML 那样可以直管的保存具有父子关系的层次结构数据。 首先定义一下我们讨论的层次结构,是这样的一组数据,每个条目只能有一个父条目,可以有零个或多个子条目(唯一的例外是根条目,它没有父条目)。许多依赖数据库的应用都会遇到层次结构的数据,例如论坛或邮件列表的线索、企业的组织结构图、内容管理系统或商城的分类目录等等。我们如下数据作为示例: 邻接表(Adjacency List)模型 我们可以很直观的使用下面的方式来保存如图所示的结构。 创建名为 distributions 的表: CREATE TABLE distributions ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(32) NOT NULL, parent INT NULL DEF....

FeignClient中每一个@RequestParam 都要设置value,否者报错

消费方代码 @FeignClient(name = “another-project-name”) public interface demoClient { @GetMapping(value = "/test") Boolean test(@RequestParam("userID")String userID); } 提供方代码 @RestController public class DemoController { @GetMapping(value = "/test") Boolean test(@RequestParam("userID")String userID){ ...... } }

springboot解决跨域问题

1、跨域起因 对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出现。针对跨域问题,我们可能第一个想到的解决方案就是jsonp,并且以前处理跨域问题我基本也是这么处理。 但是jsonp方式也同样有不足,不管是对于前端还是后端来说,写法与我们平常的ajax写法不同,同样后端也需要作出相应的更改。并且,jsonp方式只能通过get请求方式来传递参数,当然也还有其它的不足之处, jQuery ajax方式以jsonp类型发起跨域请求,其原理跟script脚本请求一样,因此使用jsonp时也只能使用GET方式发起跨域请求。跨域请求需要服务端配合,设置callback,才能完成跨域请求。 针对于此,我并没有急着使用jsonp的方式来解决跨域问题,去网上找寻其它方式,也就是本文主要所要讲的,在springboot中通过cors协议解决跨域问题。 2、Cors协议 H5中的新特性:Cross-Origin Resource Sharing(跨域资源共享)。通过它,我们的开发者(主要指后端开发者)可以决定资源是否能被跨域访问。 cors是一个w3c标准,它允....

使用注解@实现防止接口重复提交

实现逻辑 1.自定义防重复提交的注解和切面 2.在需要验证的接口上增加注解(一般是创建、修改的接口) 3.以每次调用的 用户唯一标识(userId或者sessionId或者token)+ 请求路径+参数 作为key,value任意值都可以,缓存起来(redis或本地缓存),并设置一个合适的缓存失效时间。 4.每次调用时根据key判断,缓存是否存在,存在则抛出异常或提示,不存在则执行业务逻辑 代码 防重复提交注解 ** package com.*.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; / * <p>Description: [防重复提交注解]</p > */ @Target(ElementType.METHOD) @Retention(Retention....