前言 这是一篇学习笔记,内容很多是来源于网上的资料,然后按照自己学习情况进行的总结,有些是自身的感受,有些是网上比较好的资料的引用。 如果有人看到我写的笔记有不对的地方欢迎留言指出来,是真的欢迎指出来,因为我可能会错很久,然后才发现。学习技术不能闭门造车,要多交流,多讨论,多思考才能成长的快,学的快。 我的个人博客:海加尔金鹰 什么是代理模式 代理模式的定义: 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。 根据代理类的创建时机和创建方式的不同,可以将其分为静态代理和动态代理两种形式:在程序运行前就已经存在的编译好的代理类是为静态代理,在程序运行期间根据需要动态创建代理类及其实例来完成具体的功能是为动态代理。代理模式的目的就是为真实业务对象提供一个代理对象以控制对真实业务对象的访问,代理对象的作用有: 代理对象存在的价值主要用于拦截对真实业务对象的访问; 代理对象具有和目标对象(真实业务对象)实现共同的接口或继承于同一个类; 代理对象是对目标对象的增强,以便对消息进行预处理和后处理。1 静态代理 说明及主要结构 说明: 静态代理需要先定义一个公共接口,然后被代理对....... 设计模式学习笔记之代理模式 无
感触记录 今夜,学习之中,室友房间的灯泡坏了。 关电闸,换灯泡,一件很小的事情。 我在门外帮忙看着电闸,旁边住着一对估摸70多岁的老人,平时上班只见过几面,看我大半夜在门外,屋里面还一片漆黑,老奶奶问我怎么回事,直言灯泡坏了,在换灯泡。 不一会儿,老奶奶又出来了,手上还拿着一个灯泡,老奶奶误以为我们没有灯泡,给我说我这有好的,你拿去用。这一刻,有惊讶,有不知所措,有开心,在网上看多了熊老人的视频,在生活中却遇到老好人,这种反差还是很大的。 黑夜里总有一盏灯光,照亮前行的道路。 黑夜中的一盏灯光 生活
前言 这是一篇学习笔记,内容很多是来源于网上的资料,然后按照自己学习情况进行的总结,有些是自身的感受,有些是网上比较好的资料的引用。 我的个人博客:海加尔金鹰 什么是工厂模式 在进行学习之前,我是只知道有工厂模式,但是在查阅了资料之后,工厂模式还是有很好几种的。 1. 简单工厂模式 1.1. 定义 简单工厂模式又称静态工厂模式,不属于23种GOF模式之一,属于创建型模式,由一个工厂类根据传入的参数来返回对应类的实例或者根据调用工厂类的创建方法创建对应的实例。 1.2. 核心结构 Factory (工厂类,实例创建者):负责具体实例的创建,提供给外部调用者一个实例创建方法。 Product (实例抽象接口):所有需要工厂类创建的实例都应该实现了这个接口的。 Product Bean (具体实例对象):实现抽象接口,通过工厂类返回给调用者。 1.3. 代码实现 第一步:创建一个实例抽象接口 public interface Phone { void call(); } 第二部:创建多个具体实例对象 public class HuaWeiPhone implements Phone{ ....... 设计模式学习笔记之工厂模式 无
前言 这是一篇学习笔记,内容很多是来源于网上的资料,然后按照自己学习情况进行的总结。 我的个人博客:海加尔金鹰 什么是建造者模式 在Java当中,当需要构建一个对象,并且这个对象的某些属性在构建好后有默认值或者自定义的值,通常有三种方法。 方法一:直接给属性一个默认值。缺点:不够灵活 方法二:通过构造器赋值。缺点:构造器的传参过多,不好分辨。 方式三:通过set方法赋值。缺点:如果需要设置的参数较多需要一个一个设置。 个人感觉的实际场景: 淘宝购物买电脑时经常看见的套餐,套餐一:鼠标+键盘,套餐二:鼠标+键盘+保护膜等很多的套餐。只需要选择套餐几就可以了,不需要一个一个选择。然后你觉得套餐里面的某个东西不喜欢,想换成其他的,还可以联系客服换。 然后就有了建造者模式。 1、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 2、主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。 3、如何使用:用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来) 4、解决的问题: (1)、方便用户..... 设计模式学习笔记之建造者模式 无
毕竟西湖六月中,风光不与四时同。 接天莲叶无穷碧,映日荷花别样红。 不知不觉六月份就完结了,炎炎夏日的七月到来了。 六月再见 仔细回想六月份还是有不少的感悟值得记录下来。 工作上 到七月份,我就满三个月转正了,但是我可能要被迫离职了,据说公司业务重组失败了,五月份的工资还没有发,也不知道公司能不能坚持下去。 对微服务架构有一些简单的使用,但是就我们公司的目前项目情况来说,尽管用了微服务,还存在很多的冗余服务。也感受到微服务的一些好处和坏处,对我来说更多的是坏处,感觉调试起来非常麻烦。也可能是我的项目对基础服务的依赖比较大造成的。 如果你知道你的代码哪里可能存在问题,或者业务有些不对,有时间的话经量去修改完善。测试也好方便通过,后期也没有太多的麻烦要处理。 开始学习设计模式,提高自己的能力吧,来应对可能会到来的离职。不过最近不知道怎么回事IDEA破解失败了,需要重新破解了。 最后这一点,真的是有点受不了了,公司租的的华润大厦的办公楼,400多号人在一层,重点来了,一层楼就只有三个小便池,三个大便坑。你可以想象一下上个小便,有10%的几率排队,上个大便基本排队,是一种什.... 六月再见,七月你好 无
最近修改项目BUG,定时任务这一块有很多的BUG,改了很久,记录一下相关BUG 问题1 问题场景: 新建一个定时任务,设置定时任务执行时间:2019-06-26 18:00:00 (即只在这个时间点执行一次,然后就再也不执行了) 在到达执行时间之前,进行更新和立即执行都不存在任何问题。 在到达执行时间之后,进行更新和立即执行都报错 错误信息: org.quartz.JobPersistenceException: Couldn’t store trigger: The job (DEFAULT.task-etl-19) referenced by the trigger does not exist. 问题具体原因查找过程: 创建一个周期任务,设置任务每分钟执行一次。发现不会出现这种情况。 查看任务持久化物理表,发现定时任务(只执行一次的定时任务),在执行后会自动删除。 进行代码断点,查看在何处进行的删除,没找到。 进行各种任务属性对比初步推断是quartz框架自身的一种设计,如果没有下次执行时间的任务,会自动进行删除。 在网上查找很久,找到了一篇文章,Quartz Sche.... quartz定时调度任务持久化到数据库后立即执行报错,更新任务报错引出的任务自动删除的相关问题 无
前言 这是一篇学习笔记,内容很多是来源于网上的资料,按照自己学习情况进行的总结。 我的个人博客:海加尔金鹰 什么是原型模式 原型模式:通过已有的实例对象进行复制来创建新的相同对象。 特点: 1 必须已经有一个实例对象存在。 2 通过原型模式创建的对象避免了构造器的约束,即不会调用构造器。 3 通过原型模式创建的对象和原始的对象属性值是一样的。 原型模式的实现 核心结构 (1)Prototype(抽象原型类):声明克隆方法的接口,是所有具体原型类的公共父类,它可是抽象类也可以是接口,甚至可以是具体实现类。 (2)ConcretePrototype(具体原型类):它实现抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。 (3)Client(客户端):在客户类中,让一个原型对象克隆自身从而创建一个新的对象。[^1] 核心代码 1 实现Cloneable接口 2 clone()方法 在java当中Object类种就有clone()方法 浅克隆和深克隆 浅克隆:当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制。 深克隆:除了对象.... 设计模式学习笔记之原型模式 无
前言 这是一篇学习笔记,内容很多是来源于网上的资料,按照自己学习进行的总结。 我的个人博客:海加尔金鹰 什么是单例模式 定义:一个类在系统当中只存在一个实例,每次获取到这个类的实例都是同一个。主要用于处理系统当中某个频繁创建和摧毁的类。 特点 : 单例类只有一个实例对象 该单例对象必须由单例类自行创建 单例类对外提供一个访问该单例的全局访问点。 单例模式的实现 单例模式的核心代码:构造函数私有化,提供对外访问的方式。 单例模式的实现方式有很多种,我这里就只记录推荐使用的方式: 枚举 public enum Singleton { INSTANCE; } 这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。^1 这个我感觉是用来面试装逼的,记得以前和朋友们聊面试的时候,开玩笑的说:面试不要慌,先写个单例模式在说。至于反序列化重新创建对象的问题,目前没有遇见过。 讲真的如果不是专门学习单例模式的话,我都不知道有这种写法。 饿汉式 public class Singleton { priv.... 设计模式学习笔记之单例模式 无
七大设计原则 单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:一个类负责一项职责. 里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】:继承与派生的规则. 依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程. 接口隔离原则【INTERFACE SEGREGATION PRINCIPLE】:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少. 迪米特法则【LOW OF DEMETER】:低耦合,高内聚. 开闭原则【OPEN CLOSE PRINCIPLE】:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭,为程序添加功能最好通过增加实现类而不是修改原有代码 组合/聚合复用原则【Composition/Aggregation Reuse Principle(CARP) 】:尽量使用组合,少使用继承的关系来达到复用的原则 二十四种设计模式 创建型模式 抽象工厂....... 转载: Java中的24种设计模式与7大原则 无
在本地通过IDEA,用同一个tomcat分别在8088和8089端口启动了dubbo服务端和消费端,结果发现在接口调用的时候,调用不到,并且在项目启动时还报错:dubbo Can not lock the registry cache file以及其他的各种错误。 最后解决方式:在项目启动路径上加上项目路劲, 原来两个项目的启动路径分别是:localhost:8088 localhost:8089 修改后变成::localhost:8088 /xx localhost:8089/yy 就可以没有任何的问题了。 问题原因:猜测可能是由于使用的同一个tomcat启动两个项目,然后项目路劲相同的原因。 本地启动dubbo服务端和消费端,调用不到的问题 无
最近在使用springboot拦截器的过程当中,发现无法注入service,提示NPE错误 问题相关代码 springboot拦截器注册方式: @Configuration public class MyWebMvcConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SessionInterceptor()).excludePathPatterns("/static/").addPathPatterns("/"); } } 拦截器代码: public class SessionInterceptor implements HandlerInterceptor { @Autowired private IUserService userService; @Override public boolean preHandle(HttpServletReques.... springboot拦截器自动注入为null解决办法和具体原因分析 无
问题说明 最近在工作中有一个业务需求:传入一个时间,和数据库某个时间字段进行运算,返回相差的天数。很简单的一个需求,之前sql方面比较菜,都是现将数据查询出来然后在进行计算,刚好最近写了很多的sql,有所成长,知道可以通过ceil函数直接一条sql就能查询出我想要的数据,不需要查询出来之后在进行运算。 oracle 两个时间相减 出现的错误 sql和代码都写好之后,测试报错: ==ORA-00932: 数据类型不一致== 然后检查数据库字段类型,检查参数类型,都是Date类型。这个时候有点蒙圈 问题原因 最后一想,既然类型一致,那么在传参的时候传的是什么类型呢?查看mybatis sql日志。sql日志第二行,参数后面的类型显示为:timestamp。就想到了在传参的时候就指定参数类型,也就是jdbcType。设置了jdbcType=DATE之后问题就解决了。 下面是在网上找的jdbcType关系说明 JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDec....... 由Mybatis的时间类型计算报错引出的jdbcType 无
不知不觉就来到了6月,写下五月的总结,记下对六月的期许 五月再见 * 关于工作 对于写出来的代码一定要规范,团队协作一定要多沟通。 月初的时候,接触了一个新项目,然后3个人,每个人负责两个模块,从前端到后台。 月末的时候,进行BUG的修改,有一个人离职了,然后他的BUG分给了我,改BUG的时候,回过头来看自己的代码和别人的代码,后端的代码基本上能看懂,但是这个项目的DAO层就很难看了,用的是mybatis_plu.。离职同事的sql都是通过wapper进行生成的,我的是通过注解或者XML。然后最难看的是前端,他的我看不懂,我的看着像坨翔。10个BUG8个前端最终看的眼花缭乱的,改得也是难受的。 关于生活 也不知道五月到底怎么了,成都五月的天气变幻莫测,差点感冒哦。 忙着工作,也没怎么好好生活了。 六月你好 曾今自己过六一,如今看人过六一,往后给人过六一。 坚持锻炼 不过六一过端午 多出去走走 五月再见,六月你好 生活
学习原因 最近在进行一个数据展示的项目,问题是公司目前的情况是采集到了数据,将数据存入到了一个数据中心,然后就没有任何操作了。也就是说要从原始数据当中查询数据进行数据展示,这是一个很难受的过程,但是又是一个要必然经历的过程,因为原始数据来了之后,必然要通过实际的业务来检验数据的正确性,有效性和质量,然后就对应的业务数据进行清洗,提取存入业务库,方便以后的操作。然后后端代码基本上没怎么写,全部都思考查询sql应该怎么写了。 表连接 交叉连接查询(cross join) 多个表联合查询,这种方式如果不添加where条件的话会产生笛卡儿积 但是添加了where条件的话又相当于inner join 内连接 SELECT * FROM 表A,表B where A.xx=B.xx 内连接(inner join ) 这种就相当于上面交叉连接添加了where条件。同时可以省略掉inner ,只写join。 内连接返回数据是条件相等的数据。也就是交集 SELECT * FROM 表A inner join 表B on A.xx=B.xx 外连接 (outer join) 外连接分为 left joi...... 学习日志——SQL几种表连接和连接效率 无
学习原因 在开发当中,经常看见有些字段长度是varchar(20)或者varchar(32),但是在自己建表的时候,navicat基本上都是默认的varchar(255)的长度。 所以带着疑问来学习一下数据库表字段长度的设计。 长度限制和字段选择 查阅了资料后,发现了一些关于数据库的长度限制及表设计的相关资料 相关资料: 各个数据库表名和字段名长度限制 MySQL中各种数据类型的长度及在开发中如何选择 MySql数据库表字段命名及设计规范 数据库中存储日期的字段类型到底应该用varchar还是datetime 为什么很多公司要求 mysql 表主键 id 必须是 long 型? 为什么mysql的varchar字符长度会被经常性的设置成255 在仔细阅读上述的相关资料后,算是解决了很多的疑问,也学习到了不少数据库书本上难以学习到的经验。 总的来说就是数据库表名和字段长度是有一个限制的,不是越大就好,在设计创建表字段时也要考虑下字段长度问题,根据一些实际情况选择表当中的字段类型和手动设置一下字段的长度,可以对数据的维护,查询带来效率和性能上的提升。 验证varchar(20)和var...... varchar(20)和varchar(255)的区别,数据库表字段长度设计学习 无