- 博客(53)
- 资源 (1)
- 收藏
- 关注
原创 编译Seata源码少io.seata.serializer.protobuf.generated
编译Seata源码少io.seata.serializer.protobuf.generated问题原因:缺少protobuf编译的java文件解决方案:idea安装protobuf support插件,重启idea。插件下载地址: https://github.com/ksprojects/protobuf-jetbrains-plugin下载的ZIP包在idea导入到plugins中去,直接将ZIP导入,然后重启idea,看下图构建当前报错项目,看下图,双击protobuf:compile
2022-03-19 22:46:35 912
原创 idea编译nacos源码失败com.alibaba.nacos.consistency.entity
com.alibaba.nacos.consistency.entity报错信息解决步骤下载protobuf工具配置环境变量编译报错信息找不到entity包import com.alibaba.nacos.consistency.entity.ReadRequest;import com.alibaba.nacos.consistency.entity.Response;import com.alibaba.nacos.consistency.entity.WriteRequest;解决步骤
2022-03-08 15:23:43 2104
原创 Mybatis映射LocalDateTime或LocalDate类型为NULL时报错
Mybatis映射LocalDateTime或LocalDate类型为NULL时报错自定义类型转换器LocalDateTimeLocalDate添加Mybatis配置,注册这两个类型处理器自定义类型转换器LocalDateTime@Component@MappedJdbcTypes({JdbcType.TIMESTAMP, JdbcType.DATE, JdbcType.TIME})@MappedTypes(LocalDateTime.class)public class LocalDateT
2022-02-15 17:00:06 3121
原创 idea看类结构
idea看类结构看当前类的继承结构查看当前类被哪些类实现了看当前类的继承结构Shift+Ctrl+Alt+u查看当前类被哪些类实现了根据第一步,展示出继承结构后,选中一个类使用Ctrl+Alt+B,会列出所有的实现类,在Ctrl+A全选,最后回车一下;...
2022-02-08 11:17:57 678
原创 读懂Spring AOP中通知的执行原理
读懂Spring AOP中通知的执行原理前言定义一个切面执行结果图解通知的执行流程前言这个代理类是AOP基于JDK动态代理生成的,当使用代理类调用目标方法时,会执行到org.springframework.aop.framework.JdkDynamicAopProxy#invoke方法中去,后面的调用链也在这里面。定义一个切面切面包含了环绕通知(前)、前置通知、增强方法、环绕通知(后、后置通知、带返回值后置通知、异常通知/** * 增强计算器的切面 */@Component@Aspect
2021-12-14 15:52:16 952 1
原创 Spring AOP的基本使用 Demo
Spring AOP的基本使用这个Demo是个Demo,基于main启动启动配置类启动测试类被加强的类切面类启动后的打印结果这个Demo是个Demo,基于main启动启动配置类@Configuration@ComponentScan("yuanma.xxx")//@Import(ImportTest.class)@EnableAspectJAutoProxy //开启AOPpublic class BeanConfig {}启动测试类public class AOPTestApp {
2021-12-10 23:10:55 244
原创 Mybatis sql查询结果时间类型无法映射为LocalDateTime问题
将Mybatis依赖换成<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.0</version></dependency>也就是3.5.0版本
2021-12-06 10:25:14 1199
原创 Mybatis拦截器,解决达梦数据库sql返回类型Map key大写问题
Mybatis拦截器,解决达梦数据库sql返回类型Map key大写问题拦截器功能点代码介绍拦截器入口接收Mybatis处理的结果自己处理查询结果拦截器功能点代码介绍在代码中有一句invocation.proceed();方法,如果执行了这个方法,就是mybatis自己处理查询结果返给我们用。如果不执行该方法,则我们自己可以拿到结果自己映射到返回类型中去拦截器入口import org.apache.ibatis.executor.resultset.DefaultResultSetHandler;
2021-12-06 10:18:42 3226 2
原创 获取一个接口类的所有实现类(基于Spring实现)
import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;/** * 获取到当前IOC的容器对象 */@Componentpublic
2021-11-24 14:15:20 2864
原创 HashMap jdk1.7 扩容死锁详解
HashMap jdk1.7 扩容死锁详解源码链表闭环产生的原因头插法原因详述图解步骤逐行代码画图分析线程1产生闭环的过程源码void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length;//新容量 for (Entry<K,V> e : table) { //遍历所有桶,table为当前Map中的Entry[] while
2021-10-13 11:29:23 981 2
原创 zookeeper分布式锁
zk分布式锁的三种实现基于共用注册一个节点基于再同一个路径下注册带序号的节点ZkLockService :定义一个公共接口/** * zk分布式锁公共接口 */public interface ZkLockService { /** * 加锁接口 * * @param path 抢锁路径 * @param flag 抢锁线程自己的标志 * @return */ Boolean lock(String path, Str
2021-09-02 22:01:25 158
原创 大量数据的count函数的优化
1.实时可以对索引列进行;2.大量数据的计算其实是不能实时的,这一秒和下一秒的数量可能变化很大,所以可以将count放在缓存更新,或者可以间歇的取查询mysql更新缓存。
2021-08-06 17:45:22 651
原创 大数据分页优化
当表数据大时,分页越往后面越慢第一种:分页时可以多取数据,放在缓存中去;第二种:给排序字段建立索引,每次分页时都从前一页的最后一条数据开始计算;第二种方法会出现一些问题:只能上一页或者下一页,无法跳页,还有代码不太舒服,采用较低;...
2021-08-06 17:38:46 265
原创 ConcurrentHashMap put源码解析 JDK8
ConcurrentHashMap put源码解析 JDK8sizeCtl需要了解的需要了解的变量Node对象常见的CAS方法put方法initTable()初始化tableForwardNode类addCount方法(就是size+1)size方法源码fullAddCount方法源码扩容方法 transfertransferIndex变量含义和步长transfer源码sizeCtl需要了解的sizeCtl的正确解释: https://blog.csdn.net/Unknownfuture/articl
2021-04-25 23:37:45 240
原创 Java实现 Hash一致性 (节点的增删查及数据变动,代码都未测试)
Java实现 Hash一致性 节点的增删查及数据变动,代码都未测试前言代码及方法解释代码前言内容不对概念做描述,网上描述一大堆,但是确没找到有响应的实现代码。代码及方法解释代码package com.owinfo.custom.util;import org.apache.commons.lang3.StringUtils;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import ja
2021-03-29 16:23:33 287 1
原创 ReentrantLock 之lock() unLock()源码分析(基于非公平锁)
@[TOC](ReentrantLock 之lock()源码分析)前言这里只讲解源码,不对理论做讲解;Node需要了解的属性和它的功能waitStatus这个字段解释: 这个字段其实是表示它的next节点的一个状态(初始化默认0,其他取值范围有CANCELLED、SIGNAL、CONDITION,意义见下)-AbstractQueuedSynchronizer -Node SHARED = new Node() //表示时共享锁的 EXCLUSIVE =
2021-03-26 18:09:59 157
原创 java线程池带返回值的写法
public void uploadScannerFiles(List<String> dtos) throws Exception { //获取自定义的线程池 ExecutorService threadPool = MyThreadPoolExecutor.getThreadPool(); //存放每个线程的返回值 List<Future<String>> uploadResults = new ArrayList<>
2021-03-26 09:35:48 293
原创 SpringCloud alibaba之gatway搭建(踩了很多坑)
SpringCloud alibaba之gatway搭建(踩了很多坑)搭建流程配置文件本地配置配置中心的文件配置踩坑记录搭建流程引入依赖说明: 我的加了log4j2,所以排除掉logging;路由的配置是放在SpringCloud alibaba config服务上,所以加了config的依赖,如果只是路由配置不需要放在配置中心,则需要去掉下面spring-cloud-starter-alibaba-nacos-config的依赖,不然启动会报错。<dependencyManagement&g
2020-12-13 14:40:37 779
原创 23.责任链模式
/** * 定义一个任务类 */public class Request { private Integer price; public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } public Request(Integer price) { this.
2020-11-24 10:15:38 79 1
原创 22.状态模式
状态模式状态模式:就是状态会根据流程来变化,例如工作中常见的工作流(请假申请)等;Context:这里面存放了整个流程状态的属性,还有一个流程启动方法;State:定义一个流程执行方法,并依赖Context,每个流程节点都必须实现该接口,这样当流程到这个节点时,就能拿到当前的流程状态(Context);/** * 流程控制 * */public class FlowContext { private boolean flag; // 代表流程是否结束 /**
2020-11-23 17:55:25 144
原创 21.策略模式
策略模式策略模式:就是业务有多种可能,将每种可能变成一种策略,这也是java多态的体现。主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。例如:鸭子有北京鸭子和野鸭子,他俩共同点都能游泳,不同的是北京鸭子不能飞行,野鸭子能飞。这样飞这个方式就可以独立为一种策略。FiyBehavior:飞行方式策略,接口类,具体怎么飞行,靠子类去实现,现有能飞和不能飞两种子类。Duck:鸭子类,类中可定义鸭子的公共属性,且需要聚合已知的策略(FiyBehavior)。FiyBeha
2020-11-20 15:50:55 81
原创 20.备忘录模式
备忘录模式备忘录模式: 就是记录一些之前的状态,例如一个对象的值被修改了,那么这个对象修改前的值需要存放下来。Originator:被记录的对象;Mement:当Originator对象被修改时,修改前的值需要创建一个Mement对象来记录;CareTaker:创建Mement对象后,需要把这个对象放在CareTaker中,并且CareTaker类中需要提供一个查询之前记录的方法。注:为了符合迪米特原则,还要增加一个管理(CareTaker)备忘录的类。 2、为了节约内存,可使用原型模式+备忘录
2020-11-19 17:11:44 83
原创 19.中介者模式
中介者模式中介者模式主要解决的问题: 当有多个类之间有相互调用的关系时,如果将这些类相互关联在一起,那么当调用方式发生变化时,可能需要去每个类中去修改调用方式。这样的修改会就会导致维护麻烦。中介者模式的根本还是做解耦。我在网上看了很多人解释的中介者模式和他们的举例,代码方式都不大一样,但是根据自己的理解,中介者模式就是要把各种业务类之间的关联关系转移到中介者者类当中去,让各个业务类之间解耦。举例:电器的开启顺序,可以是先电视==》冰箱,也可以是冰箱==》电视。所以这个类之间的开启顺序,就可以用中介者
2020-11-19 11:14:58 103
原创 18.观察者模式
观察者模式就是当自己的属性发生变化时,关注本类的类可以收到通知,例如:很多网站都有天气预报的功能,那么当天气预报的信息发生变化时,需要通知到这些平台,这样就可以用到观察者模式。Subject:被观察的类,类中有个观察者集合(就是Subject发生改变时,需要通知到那些类),Subject类中还需要定义一个通知的方法(notifyObserver),这个方法在Subject发生变化时调用,循环观察者集合并通知(调用观察者类中的update方法);Observer:观察者接口,该类中定义一个更新的接口(
2020-11-18 16:23:51 70
转载 17.访问者模式
访问者模式转载:https://www.jianshu.com/p/1f1049d0a0f4这个设计模式实在是没搞懂???主要解决:稳定的数据结构和易变的操作耦合问题。访问者模式介绍最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了。访问者模式是一种将数据操作和数据结构分离的设计模式。(觉得太抽象,可以看下面的例子)。访问者模式的使用场景对象结构比较稳定,但经常需要在此对象结构上定义新的操作。需要对一个
2020-11-18 16:10:00 139
原创 16.迭代器模式
迭代器模式迭代器模式: 举例,当有两种集合类型时(List和数组),如果需要对外提供对这两种集合遍历的接口,但是又不想把自己类的数据结构暴露出去时,这样的情况下就可以使用迭代器模式。迭代器模式,就是对外只提供一种遍历方式,真正的遍历方式封装在自己类的内部。举例:在学校中,学校下是学院,学院下是专业。有两个学院分别是计算机学院和信息学院,在计算机学院下有计算机专业和软件专业。在信息学院下有通信专业和信息专业。计算机学院下的专业放在List中,信息学院的专业放在数组中,如果外部调用者需要同时遍历这两
2020-11-18 11:12:21 82
原创 15.命令模式
命令模式命令模式:主要作用还是用于解耦。命令发布者和执行者之间的解耦,命令发起者不用关心谁去执行,只要把命令发给中间人,中间人把命令发给执行者。主要解决: 在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。举例: 遥控器中有开关各种电器的命令,如果使用命令模式,那么流程就应该是 遥控器发出命令==》命令中间者==》电器(电灯或电视)代码类图:RemoteController: 命
2020-11-16 17:44:08 123
原创 14.模板模式
模板模式模板模式(Template Pattern) :一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。abstractClass:该方法是抽象类,template方法(模板方法)定义了下面三个抽象方法的执行顺序,至于下面三个方法的具体实现就交给子类去实现。在模板模式中,它的模板方法被设置为 final。//定义个模板抽象类public abstract class AbstractClass{ abstract void i
2020-11-16 16:18:56 58
原创 13.代理模式
代理模式静态代理代理模式: 在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。静态代理静态代理: 最简单的代理模式,这种模式下,代理类和被代理类必须要实现或集成同一个类(这样代理与被代理类中就有同一个方法了,那么代理类可以在调用被代理类的方法同时再增强该方法)。并且代理类需要聚合被代理类(因为代理类需要调用被代理类中
2020-11-06 16:34:54 77
原创 12.享元模式
享元模式享元模式可以类似的理解成我们再代码中做了一些缓存,只是我们缓存一般是为了减少查询时间,而享元模式是为了减少对象在内存中重复创建的时间。享元模式(Flyweight Pattern) 主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。主要解决: 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。享元模式: 就是能够重复的运
2020-11-06 16:11:13 75
原创 11.外观模式(可忽略)
外观模式外观模式: 这种模式对于有工作经验的人来说会经常的使用到,用设计原则来讲,就是迪米特法则,让使用者最少的知道服务提供者的业务逻辑。将逻辑处理封装在内部,只需提供一个公共方法给使用者就行了。主要解决: 降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。...
2020-11-06 15:46:07 60
原创 10.组合模式(可忽略)
组合模式组合模式: 组合模式这个概念对于有开发经验的人来说其实很简单,就是项目中经常使用到的一种树结构,例如常见的组织架构、菜单结构等。组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。import java.util.ArrayList;import java.util.List;/** *定义公共属性和方法 *
2020-11-06 15:40:34 90
原创 9.装饰器模式
装饰器模式装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。装饰器模式的结构: 原有功能类和装饰器类都必须实现同一个接口,并且装饰器类还需要聚合原有功能类。主要解决: 一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。案例:咖啡店卖咖啡,咖啡有美式咖啡、无因咖啡等。咖啡的配料有:巧克力、牛奶等。点一份咖啡+n种配料,那
2020-11-02 16:55:37 86
原创 8.桥接模式
桥接模式桥接模式主要作用还是解耦。例如:在上面的图中,针对不同样式的手机折叠式、直立式、旋转式,他们打电话的方式都不同。而且不同的手机品牌打电话方式也不同;如果还要增加一种样式的手机,那么还需要在这种样式的手机下再增加不同品牌的手机,这种情况违反了单一职责原则。容易造成类爆炸。分析: 其实这种情景下的设计做的都是解耦,手机外形为一个类,手机品牌为一个类,两个类之间再做聚合,则两类之间就可以解耦了。再根据依赖倒置原则,尽量依赖抽象,以后增减新手机外形或者手机品牌,都只需要实现接口就行了。/**
2020-11-02 15:12:15 155
原创 7.适配器模式
适配器模式说明类适配器模式对象适配器模式接口适配器模式说明适配器模式(Adapter Pattern) 是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器模式的产生环境:例如出差时,会遇到欧标的插座,那么我们国标的插头就无法使用,这时就需要买一个插座转换器,将欧标的插孔转换成国标的插孔。国标插孔则是输出;适配主要分为三类:类适配器、对象适配器、接口适配器;类适配器模式说明:类适配器是创建一个Adapter类去继承被适配的类(欧标插座),并且A
2020-10-30 17:01:55 114
原创 6.建造者模式
建造者模式建造者模式(Builder Pattern):使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。**主要解决:**主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。**举例:**生产一个手机(外壳、电池、CPU),手机中的各种零部件都是各个地区生产的,最后再组装起来。传统做法:
2020-10-30 16:30:39 100
原创 5.原型模式
原型模式原型模式(浅拷贝)原型模式(深拷贝)实际开发中我使用的对象转换原型模式(浅拷贝)参考:https://www.runoob.com/design-pattern/prototype-pattern.html这种原型模式感觉没啥用,因为他只能clone基本类型,如果是自定义类,是无法拷贝的,属于浅拷贝,而且被拷贝的类还需要实现接口,太过于麻烦。原型模式(深拷贝)这种原型模式是采用序列化,将对象序列化成字节,再反序列化得到拷贝对象。/** * 只能拷贝相同的对象 * @param sou
2020-10-30 15:44:12 91
原创 4.工厂模式
简单工厂模式/** * 定义披萨创建过程 */public abstract class Pizza { public abstract void create(); public Pizza() { //打印一下披萨制作过程 create(); }}/** * 实现制作火腿披萨 */public class HamPizza extends Pizza { public void create() {
2020-10-30 11:28:28 139
原创 Dozer封装VO、DTO、DO、PO之间对象或List的转换
<dependency> <groupId>com.github.dozermapper</groupId> <artifactId>dozer-spring-boot-starter</artifactId> <version>6.4.1</version> </dependency>import c...
2020-10-29 17:30:27 1266 2
mybatis-generator-数据库表映射实体,生成mapper.xml,适用于mybatis-puls
2022-04-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人