Spring Boot(未完)

这年头新项目不用 Spring Boot 的大概想法比较异于常人😅

代码基于 Spring Boot 2.0

Spring-sleuth

有时候,定位bug真的是个很麻烦的事情呢

我们可以简单借用一下Spring Cloud Sleuth

Spring-全局异常拦截

Spring MVC那一篇里提到了异常拦截来做参数校验返回,那里是对特定的 controller 做异常捕捉,但是我们也可以选择全局拦截处理

Java-Java基础

摘要

本文是对一些java基础知识的整理,把之前印象笔记里面的全部慢慢搬到这个blog来

为了方便就按照《thinking in Java》的目录来编辑。

这里面的内容均为面试题相关,可能的考点等

这本书里面有些翻译不是很好,建议和英文版对照。

提醒:文章较长,因为很早写的,罗列的知识点较多,在慢慢把知识点摘取出去以链接形式存在。

cookie

今天被我们的前端同学气的半死,但是他问我为什么没有cookie的时候我是没有看见cookie……

恶补一下cookie的知识,为了下次能不要再懵逼

Mybatis-小问题

一、Parameter ‘id’ not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2] 原因:多入参的情况下没有在参数前加@Param 特殊原因:加了@Param还是报错,查看你是import的依赖是不是org.apache.ibatis.annotations.Param 可能会不小心导入org.springframework.data.repository.query.Param

MySQL-索引

什么是索引

索引用于快速找出在某个列中有一特定值的行

Java-HttpClient

HttpClient的介绍

一般步骤

  1. 取得HttpClient对象
  2. 封装http请求
  3. 执行http请求
  4. 处理结果

请求类型

GET, HEAD, POST, PUT, DELETE, TRACE 和 OPTIONS

官方示例

//1.获得一个httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
//2.生成一个get请求
HttpGet httpget = new HttpGet("http://localhost/");
//3.执行get请求并返回结果
CloseableHttpResponse response = httpclient.execute(httpget);
try {
//4.处理结果
} finally {
//5.关闭response
    response.close();
}

工作流

零、工作流相关概念

1、工作流(Workflow)

工作流是对工作流程及其各操作步骤之间业务规则的抽象、概括、描述。

工作流建模,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。工作流要解决的主要问题是:为实现某个业务目标,在多个*参与者*之间,利用计算机,按某种预定规则*自动传递*文档、信息或者任务。

工作流管理系统(Workflow Management System, WfMS)的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。工作流需要依靠工作流管理系统来实现。工作流属于计算机支持的协同工作(Computer Supported Cooperative Work,CSCW)的一部分。后者是普遍地研究一个群体如何在计算机的帮助下实现协同工作的。

​ ————来自维基百科。

工作流最大的好处是 系统自动流转。拿上面的文档管理系统来说系统可以自动按照设定的步骤流转,如果系统可以处理的,自动处理掉,如果系统不可以处理那用某种方式通知需要处理的人,让人介入,而不需要人主动去关注现在应该做哪个步骤。

2、BPMN(Business Process Model and Notation)

业务流程模型注解(Business Process Modeling Notation - BPMN)是 业务流程模型的一种标准图形注解。这个标准 是由对象管理组(Object Management Group - OMG)维护的。

基本上,BPMN规范定义了任务看起来怎样的,哪些结构可以 与其他进行连接,等等。这就意味着意思不会被误解。

推荐阅读:BPMN 2.0

Activiti用户手册-BPMN2.0

Tomcat-日志

昨天装了SSH,连接到了linux的远程服务器,然后和我说可以查看Tomcat的日志

我:喵喵?

好吧我承认我没怎么搞懂日志这个东西

Git-基本操作

继装Git就遇到很大的问题后,我发现我对Git并不是很了解……因为之前都是直接用sourcetree的

整理学习一下吧

当然,新手其实最需要的就是三个技能:clone,merge,push

杭州二手房

零、写在前面 家里有在杭州买房的需求,自己还在忙着找工作,只能说结合着来了XD。 这几天恰好围观了下GitHub上的这个repository star数蹭蹭蹭往上涨啊 其实作者的数据真的是相当得全了 但是作为一个强迫症,幻想着如果能在一张图内显示所有自己需要的数据就好了啊 一、数据 需要的数据 杭州二手房看房、询价、谈判、过户技巧 这篇看下来受益良多,大致也能分析出我们在去找中介之前, 自己的需求: 预算 交通 户型和大小 楼层 学区 朝向 etc… 网上所需要收集的数据: 小区位置 小区单价:其实这里还需少户型,但是这个数据批量不好找 小区年代:老房子会有很多问题,新房子肯定贵 地铁位置 主干道交通 周边学校、商场、医院、菜场、超市等 收集数据 小区的数据: 一个爬虫解决,链家的数据还是比较靠谱的。 地铁的数据: 杭州运行的地铁(截止2018.2.27)只有三条,在建2条,其余的均为规划。 参考:杭州市轨道交通三期线路及沿线用地控制规划(草案) 人力把能找到的地铁经纬度全部找了出来,部分连周边道路都是规划中的除外(萧山有部分地铁站真的是荒郊野岭) 用了最简单也是最强大的excel,然后把数据导出为csv,再导入MySQL。 其余数据: 准备使用地图的api,所以不用收集。 处理数据 计算出每个地铁站和小区之间的距离,每个小区取最小值,为其最近地铁站。 UPDATE lianjia_xiaoqu AS r, ( SELECT a.housecode, a.distance, b.metro, b.metro_line FROM ( SELECT housecode, min( distance ) AS distance FROM xiaoqu_metro_distance GROUP BY housecode ) AS a, xiaoqu_metro_distance AS b WHERE a.

小黑屋-Java-JavaSE组件

Java Language Tools & Tool APIs 名称 功能 javac 把.java文件编译为.class文件(每个类一个.class文件) javadoc 生成Java说明文档,api文档 jar 软件包文件格式,归档文件 javap JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。 JPDA(Java Platform Debugger Architecture) Java平台调试器架构 JConsole 内置 Java 性能分析器? Java VisualVM 集成了多个JDK 命令行工具的可视化工具 Java DB 开放源码数据库管理系统 Security Int’l RMI IDL Deploy Monitoring Troubleshoot Scripting JVM TI Java 虚拟机所提供的 native 编程接口 Web Services java java.

MySQL-开发

本文整理自《深入浅出MySQL数据库开发、优化与管理维护(第2版)》

第二部分 开发篇

Java-HashMap

摘要(未完)

查看了一下HashMap源代码,一些基本知识点

参考资料里面其实写的很好,建议看参考链接

关于我

NAME:5q+b5b2m5am3 SCHOOL&MAJOR:浙江工业大学 57uZ5rC05o6S5rC05bel56iLMjAxNuWxiiDmnKznp5E= Email:ZmhtYW95YW50aW5nQDE2My5jb20= GitHub:https://github.com/maoyanting 工作历程 2016年7月毕业后就职于杭州某市政设计院,2017年5月初辞职自学。 2018年3月正式在一家互联网医疗企业就职,从事java后端开发工作 2019年7月跳槽到大搜车 个人评价 JAVA基础较好,掌握I/O,多线程,集合等基础框架,JVM有排查经验 熟悉MySQL,Redis,MQ,Dubbo等 代码格式强迫症,简洁代码爱好者,领域驱动半吊子,leetCode间歇访问人员 对技术有热情,具有快速学习的能力,工作协调能力极强; 关于Blog 本blog里面的基本都是学习笔记而不是文章,只是在整理收集知识,还没有到达产出的级别 自认为,blog里面的分两种: 学习笔记:写给自己的,对获取的知识进行格式转换,转换为自己能吸收的格式;不做笔记纯靠脑子转化的效率对吾等凡人来说还是太低,再加上如果没使用的话,没多久就忘记了。 文章:写给读者的,这种需要循序渐进,对于读者也要照顾到读者的知识层面,写的好的不多。 之前学习笔记都是用印象笔记的,偶尔有文章会发到CSDN上去,虽然都很好用但是总觉得差了点什么 看大家都自建blog就想着搞一个啦 markdown简直是最爱(当然表格什么的展示还是很心塞) 最后吐槽下写java的小伙伴们,你们的排版能不能好看点啊啊啊啊!看看前端的文章,那排版总体素质甩了写java的好几条街啊!

Spring-注释

注释 @Component: 功能:表明该类会作为组件类,并告知Spring要为此创建bean 下述这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。 @Service 用于标注业务层组件 @Controller 用于标注控制层组件 @Repository 用于标注数据访问组件,即DAO组件 @Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 @ComponentScan: 功能:在Spring中启用组件扫描(默认组件扫描不启动),默认扫描与配置类相同的包; @ComponentScan(”packageName”) 指明是基础包:@ComponentScan(basePackages=”package1Name”)@ComponentScan(basePackages={”package1Name”,”package2Name”}) 另一种方式:@ComponentScan(basePackagesClasses={ package1Name.class , package2Name.class } ) @Autowired: 功能:声明要进行自动装配 使用:在构造器和方法 上 默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。 加上@Autowired后不需要getter()和setter()方法,Spring也会自动注入。 @Qualifier 功能:按名字装配bean 当我们在 Spring 容器中配置了两个类型为 Office 类型的 Bean,当对 Boss 的 office 成员变量进行自动注入时,Spring 容器将无法确定到底要用哪一个 Bean,就会发生异常。 Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。 @Resource 功能:按名字装配bean 是JDK1.6支持的注解(非Spring),默认按照名称进行装配。 名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。 @Configuration: 表明此类是个配置类

MySQL-基本操作

本文整理自《深入浅出MySQL数据库开发、优化与管理维护(第2版)》

第一部分 基础篇

JavaWeb-WebSocket在Spring+React的实现

背景 先说一下别的轮询方式: ajax轮询:让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。 long poll:浏览器发起连接后,如果没消息,就一直不返回Response给浏览器。直到有消息才返回,返回完之后,浏览器再次建立连接,周而复始。 ajax轮询 需要服务器有很快的处理速度和资源。 long poll 需要有很高的并发。 再说webSocket,先必须记住,webSocket是一个协议 我们使用的应该说是webSocket API WebSocket是基于TCP的独立的协议。 和HTTP的唯一关联就是HTTP服务器需要发送一个“Upgrade”请求,即101 Switching Protocol到HTTP服务器,然后由服务器进行协议转换 //简单来说,就是我是从TCP那边继承过来的,干活需要依靠HTTP先帮我连接上 前端部分: 最简单的实现: const ws = new WebSocket("ws://echo.websocket.org/ws"); ws.onopen = function(evt) { console.log("Connection open ..."); ws.send("Hello WebSockets!"); }; ws.onmessage = function(evt) { console.log( "Received Message: " + evt.data); ws.close(); }; ws.onclose = function(evt) { console.log("Connection closed."); }; 后端部分 先放官方文档(我用的是spring 4.3.13.RELEASE) 其实基本上就4四个部分: 1. 添加依赖 2. Handler类 3. 拦截器 4. 配置 添加依赖 <dependency> <groupId>org.

Kafka-内部分析

简介 设计目标 1、以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能。 2、高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。 3、支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输。 4、同时支持离线数据处理和实时数据处理。 5、Scale out:支持在线水平扩展。 结构 Kafka通过Zookeeper管理集群配置,选举leader 在Consumer Group发生变化时进行rebalance。 Producer使用push模式将消息发布到broker, Consumer使用pull模式从broker订阅并消费消息。 Topic & Partition Topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。 🔔若创建topic1和topic2两个topic,且分别有13个和19个分区,则整个集群上会相应会生成共32个文件夹(本文所用集群共8个节点,此处topic1和topic2 replication-factor均为1)。 每个日志文件都是一个log entrie序列 每个log entry包含一个4字节整型数值(值为N+5),1个字节的”magic value”,4个字节的CRC校验码,其后跟N个字节的消息体。 每条消息都有一个当前Partition下唯一的64字节的offset,它指明了这条消息的起始位置。磁盘上存储的消息格式如下: message length : 4 bytes (value: 1+4+n) "magic" value : 1 byte crc : 4 bytes payload : n bytes 这个log entries并非由一个文件构成,而是分成多个segment,每个segment以该segment第一条消息的offset命名并以“.kafka”为后缀。 另外会有一个索引文件,它标明了每个segment下包含的log entry的offset范围,如下图所示。 效率: 因为每条消息都被append到该Partition中,属于顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)。 因为Kafka读取特定消息的时间复杂度为O(1),即与文件大小无关,删除过期文件与提高Kafka性能无关。选择怎样的删除策略只与磁盘以及具体的需求有关。 另外,Kafka会为每一个Consumer Group保留一些metadata信息——当前消费的消息的position,也即offset。这个offset由Consumer控制。正常情况下Consumer会在消费完一条消息后递增该offset。当然,Consumer也可将offset设成一个较小的值,重新消费一些消息。因为offet由Consumer控制,所以Kafka broker是无状态的,它不需要标记哪些消息被哪些消费过,也不需要通过broker去保证同一个Consumer Group只有一个Consumer能消费某一条消息,因此也就不需要锁机制,这也为Kafka的高吞吐率提供了有力保障。 关于已经被消费的消息: 对于传统的message queue而言,一般会删除已经被消费的消息,而Kafka集群会保留所有的消息,无论其被消费与否。 当然,因为磁盘限制,不可能永久保留所有数据(实际上也没必要),因此Kafka提供两种策略删除旧数据。 一是基于时间 二是基于Partition文件大小。 🔔可以通过配置$KAFKA_HOME/config/server.properties,让Kafka删除一周前的数据,也可在Partition文件超过1GB时删除旧数据。 Producer消息路由 Producer发送消息到broker时,会根据Paritition机制选择将其存储到哪一个Partition。如果Partition机制设置合理,所有消息可以均匀分布到不同的Partition里,这样就实现了负载均衡。如果一个Topic对应一个文件,那这个文件所在的机器I/O将会成为这个Topic的性能瓶颈,而有了Partition后,不同的消息可以并行写入不同broker的不同Partition里,极大的提高了吞吐率。 🔔可以在$KAFKA_HOME/config/server.properties中通过配置项num.partitions来指定新建Topic的默认Partition数量,也可在创建Topic时通过参数指定,同时也可以在Topic创建之后通过Kafka提供的工具修改。

JavaWeb-Servlet

这个只是学习笔记,我是个刚学半年编程的半吊子,里面的内容可能会出错,所以也不建议转载 我会尽力保证里面的正确性,如果有错请指出,万分感谢

SSM + dva 之前端踩的坑

技术栈 后端:SSM + Tomcat 前端:dva + roadhog + antd + React 提示:dva的坑很多,react的体系很大(学习成本很高)不过github上Q&A很多也比较全面 然后其实这个适合做后台页面,所以才封装得那么像java吧 前后端衔接部分: 网上找了很多都没有我能用的,我自己最后弄了个比较蠢的方法 首先往.roadhogrc里面添加 "publicPath": "./", "outputPath": "你的webapp的路径",12 publicPath 修改是为了保证到时候build出来的文件的静态目录不出错 其实这里很奇怪,为什么webpack自己本身不去弄好这个 前端的代码写好以后,直接npm build到webapp的目录下 这步操作先会让webapp里面所有的文件清空 我自己比较蠢的方法就是把web.xml文件复制出来,每次build后再复制进去 更新:后来觉得这样做实在是太傻逼兼太麻烦了 在.roadhog里面加上了这个代理 "proxy": { "/api": { "target": "http://localhost:8080/exampleone/", "changeOrigin": true, "headers":{ "host":"localhost:8080/exampleone/" }, "pathRewrite": { "^/api" : "" } } },12345678910 这里面的内容可以参考:https://www.jianshu.com/p/3bdff821f859 service里面和后端的交互: export async function login(data) { return request('/api/login', { /* 之前这里是/exampleone/login。我是build后使用这个方式*/ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.