- 博客(45)
- 收藏
- 关注
原创 从一个随机出现的错误开读Mybatis源码
对于两个拥有相同方法名,但入参不同的方法,Mybatis会如何处理?如果采用传统的 XML,XML 必须指定一个id,当在启动时,就会报这个 id 冲突了,这个问题在之前遇到过。但如果不用 XML,用的是注解呢? 思考这个问题是处于是想调用两个重载的方法中的第一个双参方法,却发现偶尔成功,偶尔报错: Paramter not found,没有发现这个报错的规律。开读入口从一些地方了解到,Mybatis 其实就是在运行时,对于每个 Mapper 的方法调用最终都会被一个代理所捕获:在 cach
2022-06-11 17:17:07 185
原创 技术栈无关doc文档生成方案
日常工作接触到一些需要生成各种 doc 文档的场景,总结了一下共有几种方法来生成 doc 文档:第一种是跟特定技术栈绑定的,并且我没有太多使用经验,重点就介绍后面两种使用模板来生成一般就是把一个 doc 文件另存为 xml 或者 html 文件, 然后使用一些模板库,通过模板语法生成一个渲染后的 xml 或者 html, 然后将其存为 doc 文件。很多语言都有相关的模板库, 如 Java 的 Freemarker, JS 的 art-template。这在实现上就有许多灵活性,如可以直接在前端直接渲染相关
2022-06-11 17:13:49 242
原创 谈谈组合策略模式及在生产的应用
学设计模式第一次听到这个模式时被迷惑了,以为所谓的组合模式是跟面向对象编程里的组合概念的一样读了 GOF 的设计模式之后,书里是将组合模式描述为也就是说组合部分与被组合部分在对外表现上,应该都是一致的,也就是其实是这样的真正让我理解组合模式和它的妙用是在《领域驱动设计》这本书里面,作者提出了一个航线的概念,也就是这样,通过组合基本组件以达到功能更强大的一个组件策略模式所谓策略,则可以理解为针对某种特定问题的算法,由于不同的算法各有优劣,所以需要将策略抽象为一个接口,让客户代码根据需求选
2022-06-11 17:12:05 370
原创 谈谈模板方法模式在实际生产的应用及代码复用
18 年,仍是个小白的时候写了一篇 谈谈模板方法模式这篇文章也不想再复制一些难以读懂的概念,简而言之,模板方法就是提取一些公用代码到父类,然后由子类去具体实现父类里没有实现的代码逻辑,目的就是为了代码的复用这个业务是这样的,由于系统运行在某个不可描述的内网里面,数据交换都是通过 FTP 服务器来进行的,所以当数据发送到 FTP 服务器之后,我们就需要定时拉取上面的文件下来,并自定义文件的业务处理流程,处理成功之后就需要把文件删除掉所以就有了这么样的一个设计:这个设计直至现在用的仍很舒服,但经过了几次改
2022-06-11 17:08:03 182
原创 线程池的使用及遇到的一些问题
线程池的使用及遇到的一些问题线程池是并发编程在生产环境最常被使用到的一个组件核心参数在使用好线程池之前,必须明白如何构建线程池,想要明白如何构建线程池,则必须明确构建线程池所需的 5 个参数ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 2/*实际运行线程数 (不管它们创建以后是不是空闲的。线程池需要保持 corePoolSize 数量的线程)*/, 3/*最多允许创建的线程数*/, 0L /* 让
2022-03-20 15:02:47 1180
原创 桥接模式的实际使用
桥接模式的实际使用桥接模式的定义“将抽象部分与实现部分分离,使它们都可以独立地变化”这句话本身就很抽象 但是大概可以了解到有两个主体:抽象部分 实现部分动作就是让他们独立地变化, 从独立变化我们可以了解出, 应该是通过接口隔离或者抽象类的方式来隔离变化桥接模式的类图那么根据类图, 他们的代码是这样的abstract class Abstraction{ Implenmentation impl; void function(){ use impl;
2020-09-22 18:39:33 423
原创 JAVA实现节流阀
JAVA实现节流阀在前端开发中,有种效果叫做节流阀顾名思义,节流阀的作用是限制某些事件的执行频率,基本代码如下:obj.event = function(){ clearTimeout(obj.timer); obj.timer = setTimeout(() => { execute }, timeout);}JAVA实现在JAVA中,我们也需要一些类似的效果抽象我们抽象出一个pool,这个pool可以接受你的任务,如果是同一个任务,会覆盖之前还没执行的任务c
2020-05-24 22:51:24 727
原创 调试一个wsl2+java引发的bug
java如何处理localhost这个主机名的?调试一个wsl2+java引发的bug最近听说wsl2将要在2004稳定可用,于是就赶了时髦在使用了wsl+docker部署了数据库和nacos等等东西,将原来使用虚拟机的容器都迁移过去这迁移后就出了问题,目前(2020 04 16)wsl2是无法自定义ip地址,但是之前的版本更新已经可以将localhost的请求转发到wsl2里面去当我部署...
2020-04-17 21:29:51 480 2
原创 Spring(四):事务管理
事务首先,我们要知道事务是什么构成单一逻辑工作单元的操作集合称为事务事务的ACID特性原子性:不可分割的最小操作单位,要么同时成功,要么同时失败一致性:事务操作前后,数据总量不变隔离性:多个事务之间相互独立持久性:当事务提交或回滚后,数据会持久化的保存数据传统编程的事务管理在传统的JAVA数据库编程中,我们遵循的是打开连接-执行操作-提交事务-关闭连接,如下面的代码:C...
2019-11-30 11:56:31 184
原创 Spring(三):AOP
AOP什么是AOP百度百科:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程...
2019-11-05 17:50:18 173
原创 Spring(二):Bean的装配
讲解bean的装配自动化装配注解配置当使用@Configutation注解的类,则声明该类为一个配置类,与配置类有关的注解还有:@ComponentScan@ComponentScans它们都是用来指定包扫描路径的,使用方法如下:@Configuration@ComponentScan("wang.ismy.spring")public class Config {}装配...
2019-10-30 12:46:22 193
原创 Spring(一):概览
设计关键策略基于POJO和最小侵入性编程通过依赖和面向接口实现松耦合基于切面和惯例进行声明式编程通过切面和模板减少样板代码Spring通过依赖注入,应用切面以及各种模板来简化JAVA开发起步引入依赖<dependency> <groupId>org.springframework</groupId> <artifac...
2019-10-14 11:04:27 231
原创 初探ThreadLocal
在使用spring boot的时候,发现这么样一个很有意思的功能:RequestContextHolder.getRequestAttributes()).getRequest()可以通过这么样的一个类来获取当前的Request对象,第一反应就是spring boot替我们完成了request对象与当前线程的绑定。那这内部,又是如何实现的?这个RequestContenxtH...
2019-05-11 13:56:04 238
原创 谈谈传统BIO网络编程模型的局限性与NIO
先来看看我们的server端:创建一个serversocket,进行监听,每来一个客户端,就启动一个新启动为其服务:private void createListenSocket() { //如果创建监听socket的时候发生异常,将会隔WAIT_TIME毫秒重试,直到成功 while (true){ try { ...
2019-04-25 12:28:52 370
原创 使用AOP来实现接口请求频率限制
老规矩,定义一个注解:/** 被该注解修饰的方法都会被切面拦截进行请求次数限制*/@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Limit { int maxRequestPerMinute();}我们在想要进行频率限制的方法上添加注解:@Reque...
2019-04-20 13:15:31 2327 1
原创 使用AOP实现权限拦截校验
aop的好处就在于它可以只让你写一次代码,然后这些代码就可以用于容器当中的所有对象,权限拦截校验是一个表现形式。那么,我们要如何实现这个功能?首先,定义一个注解:/** 被该注释修饰的方法都会经过切面拦截校验权限*/@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface ...
2019-04-14 11:14:51 1955
原创 无限树型菜单分类
有这么样一个需求:将以下二维记录转成一个树型菜单很明显,结果将是森林。那么这里提供一个通用算法,来实现菜单的转换。首先,将所有记录读入:List<Department> departments = departmentMapper.selectAllDepartment();其次,使用一个哈希表,将各部门id与部门实例进行映射:Map<In...
2019-04-08 13:13:09 467
原创 个人对三层架构的看法
java web开发当中,有这么三层:controller、service、dao分别为表现层、业务逻辑层以及数据访问层。这样分层的好处有很多,出了问题易于调试,或者便于团队合作等等。最重要的是,可以随时换掉其中的某一层而不影响其他层,这都是借鉴于早期的程序设计经验,计算机网络体系也是这么设计的。在我初学时,总是认为service层就是个累赘,认为它只是对请求的转发,但是随着学习的...
2019-04-02 14:21:47 326
原创 依赖注入项目总结
这个小demo代码量不算多,不过几百行。但是写了两三天,其中不少地方删删改改,最后勉强实现了spring中的核心功能:依赖注入我本身用过spring和guice这两种依赖注入框架,spring很强大,没错,但是spring一个让人诟病的地方就是繁杂的配置,几百行的配置文件都算是基础。guice的话,这个框架吸引我的地方就是完全通过java代码配置,完全扔掉了xml。无论是哪个框架,...
2019-03-16 17:47:33 241
原创 java如何扫描本项目下的所有类
最近在写一个依赖注入的小demo,碰到这么样的一个问题:要把本项目下所有被@Component修饰的所有类注入到容器当中。思路很简单,通过文件枚举的方式扫描出本项目的所有类文件,再对文件名进行一些小处理,就能得到本项目的所有类。public static void scanAllClasses() { String url = getClassPath(); ...
2019-01-28 18:04:12 1789
原创 测试驱动开发初体验
测试驱动开发有下列三定律: 编写不能通过的单元测试前,不可以编写生产代码。 只可以编写刚好无法通过的单元测试,不能编译也算不通过。 只可以编写刚好足以通过当前失败测试的生产代码。个人是不喜欢这些条条框框,这些东西看起来未免有一些教条主义。概括一下上面三条原则:测试先于生产代码,生产代码是为了测试而写的。let‘s do it!这里用到了junit这个单...
2019-01-14 17:42:01 2046
原创 JAVA synchronized初体验
先来看看synchronized这个关键字是什么意思:同步,同步什么?要同步的就是这个关键字后面紧跟的花括号里的代码,也就是代码块。为什么要同步?来看一个例子:public static int i=0; public static void main(String[] args) throws InterruptedException { v...
2019-01-02 18:29:37 142
原创 对当前JAVA流行框架的一些小感悟
这几年,蹦出了不少各种JAVA框架,像是spring boot、spring cloud 和spring mvc或者是mybatis等等。不断有人感慨,技术更新的太快,自己学都学不过来了。但是,这些所谓的新框架,它们真的新吗?拿这两年比较流行的spring boot来说,它根本就不能算是一个新的框架,充其量也就是spring和spring mvc的整合,这个框架给程序员提供了一个更加便...
2018-12-23 21:24:27 881
原创 开源一个命令行远控工具
整个项目都是使用java写的,包含server端、control端(被控端)以及master端(主控端)。先来看看演示:这个程序的结构就是允许多个客户端连接服务端,并且客户端之间可以通过服务端来进行通信,消息的交换格式我使用了json。所以说,这个程序只是socket聊天的一个变体。这是服务端的代码结构:这是被控端的代码结构:共同模块:当然,如果把这些做...
2018-12-22 14:56:17 1036
原创 谈谈模板方法模式
老规矩,看看百科上是怎么描述模板方法模式的:模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。回到实际开发中,代码写多了,可能就会碰到这么样的一种情况,我们有两个算法,两个算法在整体上来看上差不多的,但是细节上又有一点差异。比如泡茶和泡咖啡。从整体上来看,就是放入原料,然后冲入开水,最后再搅拌一下,...
2018-12-20 12:42:05 145
原创 记录一个spring boot 静态资源访问问题
spring boot 只要把静态资源放在static目录下,理论是可以直接访问的。但是,今天却发现了一个很是头疼的问题,静态资源放入static文件夹了,但通过浏览器却是访问不到。网上搜索了一大堆,都是一份文章你抄来,他抄去,一点价值都没有。于是回到控制台,仔细查看spring boot 启动时输出的日志信息:发现spring boot并没有对这个URL做映射,这应该是我做了...
2018-11-29 18:18:36 373
原创 说说JAVA当中的equals
equals这个属于Object类的方法,几乎每天都在用,可是看着它,却是既熟悉,又陌生。先来看看Object中的equals中写了什么:public boolean equals(Object obj) { return (this == obj);}恩...似乎没有什么用,只是把当前对象的引用与传入的obj进行对比,于是,就会出现这么样的一个情况:Stri...
2018-11-28 20:52:20 291
原创 一个关于JAVA GC的小实验
关于JAVA的GC,我只是略微了解,我知道如果一个对象没有其他东西引用它,它就会在适当的时机被回收掉。但,如果一个A对象持有B对象的引用,后对A对象的引用被置为null,那么B对象还会被回收吗?如果B被回收,那么顺序是怎么样的?是A先,还是B先?就让我们来实践一下:创建两个类:public class MyObject { private MyObject1 myObj...
2018-11-22 17:51:27 219
原创 说说发布/订阅模式
说到观察者模式,就不得不谈谈发布订阅模式。可以说发布订阅模式就是观察者模式的一种特殊情况。回到上一篇文章的商城,假设又有一个新需求,有些合作商家只对特殊种类的商品进行推送,这,又该如何实现?来一起完善下代码:对Product类新增一个字段,该字段用来描述商品: public class Product {private Kind desc;public void setD...
2018-11-14 17:23:12 471
原创 谈谈观察者模式
传说,好莱坞有一条规则:别来找我,我会去找你。观察者模式,有两种角色:观察者,以及通知者(或者叫目标对象)。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。单谈概念总是很虚,让我们来看一个实例:假设我们有一个商城,有这么样一个需求,当商城上架新的商品时,要将产品推送到各个合作商家,...
2018-11-12 21:27:57 236
原创 谈谈JAVA实现节假日验证
我们需要两个类,第一个类:我们叫它验证类。第二个类:它是对法定节假日的抽象。第一步开始: 当验证类被初始化的时候,会加载本年的所有法定节假日到一个list里:thisYearHolidays.add(new Holiday("元旦") .setHolidayRange(LocalDate.now().withMonth(1)....
2018-11-10 11:49:19 1227
原创 对适配器模式的思考
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。就像中美两国的插头标准是不一样的,可以用一个转接头来适配。假设第三方库有这么样的一个类:class ThirdPartService{ public void run(){ //TODO }}那么这时候为了统一操作,可以对这个接口进行封装(适配),...
2018-11-06 10:29:09 312
原创 一只编程菜鸟对编程的思考
引言编程,是一门实践科学,意味着你学习编程的最好方式就是上手敲代码,但这意味着我们能因此轻视理论的学习吗?入门编程上各大交流社区,提问该如何入门编程,五花八门的答案蜂拥而来。但是总结一下,莫不就是一下几种: 学院派: 推荐入门学习C语言,辅之修以数据结构、操作系统等科班课程,唯有这样才能得到编程的真谛。 自由派: 推荐入门学习...
2018-10-31 14:56:51 389
原创 使用AOP实现参数验证
今天,我们使用AOP来开发一个参数验证。首先,我们理理这个参数验证的原理以及流程。第一步,我们会定义一个注解,这个注解可以被用来修饰某一方法的参数,如下:public Object login(@RequestBody @CustomValid LoginDto loginDto, HttpSession session){ return loginService.l...
2018-10-29 13:36:09 1983
原创 谈谈AOP在缓存设计上的应用
我们知道,AOP所体现的,就是一种拦截→放行的思想,底层是基于JDK或CGlib的动态代理实现的,其应用场景非常多:日志记录、权限控制,事务管理以及今天所要说的缓存。上图就是代理对象与真实对象之间的关系,外界通过代理对象与真实对象进行交互,对于外界来说,代理对象就是它所需要的真实对象,外界不关心它真正是谁,只要提供它所需要的接口即可。那么,我们是否可以在代理对象与真实对象之间的通道中,...
2018-10-22 22:40:17 455
原创 谈谈我对多态的理解
什么是多态多态是面向对象的特性之一,从字面上理解,多态就是指一个对象在运行是会有多种形态,就比如可以说student是一个person,也可以说student是一个object。我们来看一个经典的例子:Service service=new ServiceImpl();我们经常看到这样的代码,这就是多态的一种表现。为什么要多态多态可以让代码更加灵活,再举一个例子:L...
2018-09-12 20:28:39 1143
原创 谈谈我眼中的IOC
控制反转(IOC)。什么是控制反转那么这里就涉及到了两个词,控制与反转,什么控制什么,什么被反转了?在普通的编程中,如果我们需要一个对象,就会这个样子:Object obj=new Object();这样就是通过我们手工来创建一个对象,是我们主动去创建,也就是由程序员来控制对象的产生。那么据此可知,控制反转就是对象的控制权被移交给了一个第三方,由第三方来控制对象的产生销毁...
2018-09-10 22:07:44 148
原创 实践验证ArrayList与LinkedList的性能表现
我们在学习JAVASE的时候就知道,ArrayList底层是以数组实现的,LinkedList则是以链表的形式实现的。那么我们今天就能探究一下两者在插入数据和随机访问数据方面的性能表现。实验环境:系统:win10 64位 JDK:10 CPU:i5-4210u 内存:8GB数据量:10...
2018-09-08 10:53:06 240
原创 谈谈我对JAVA内存可见性的理解 JAVA
首先要明确一点,每个线程都有属于自己的工作内存。出了线程自己拥有的工作内存外,还有公共内存。假设我们有一个变量i,然后我们启动两个线程,这个时候i就会被拷贝成两份副本分别给两个线程的工作内存。然后,这两个线程如果对i进行操作,系统首先会将改变后的i先写到线程的工作内存,然后再写到公共内存中。如果一个线程改变了i的值,没有将它及时写入公共内存中,就会造成两个线程数据不一致。...
2018-09-06 16:46:55 211
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人