自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 收藏
  • 关注

原创 Springboot集成Ehcache3实现本地缓存

如果只需要在单个应用程序中使用本地缓存,则可以选择Ehcache;它支持内存和磁盘存储,这里不以注解方式演示,通过自己实现缓存管理者灵活控制缓存的读写;5、编写缓存管理者,来控制缓存的增删改查。6、编写controller进行简单测试。3、配置ehcache.xml文件。7、分别调用接口查看日志打印。4、编写缓存策略枚举。

2024-04-15 17:27:26 232 1

原创 Springboot使用外部yml启动

有时候我们想更灵活的使用配置文件,例如同一套代码去部署多个客户,此时差异大的地方其实只是配置文件,这是我们希望每次启动项目从外部读取配置文件来加载项目,你可以使用一些配置中心来实现,当然也可以自己定义外部文件来实现。项目模拟外部文件读取。

2024-03-11 14:57:08 453

原创 Springboot实现缓存预热

很多时候我们代码中使用缓存时都是先判断缓存中没有数据我们再读取数据库而有则直接使用缓存数据,而在系统冷启动(当系统重启或新启动时,缓存是空的,这被称为冷启动)时,我们毫无意外都是直接获取数据库的内容,这时候缓存的命中率几乎为0,这时候我们需要考虑业务系统的缓存预热功能,在系统启动之前通过预先将常用数据加载到缓存中,以提高缓存命中率和系统性能的过程。缓存预热的目的是尽可能地避免缓存击穿和缓存雪崩。2、实现InitializingBean接口,并在afterPropertiesSet方法中执行缓存预热的逻辑。

2024-03-04 11:40:21 564

原创 Springboot接口参数校验

在设计接口时我们通常需要对接口中的非法参数做校验,以降低在程序运行时因为一些非法参数而导致程序发生异常的风险,例如登录的时候需要校验用户名密码是否为空,创建用户的时候需要校验邮件、手机号码格式是否准确。如果你的一个实体中的字段某一些是新增的时候必传,某一些修改时又不用传,那么对于不用传的字段肯定不需要校验的,这时候如果我们共用一个实体作为多个接口参数那肯定存在兼容问题,此时你就可以考虑将参数分组判断。接口的第一个参数是 自定义注解类型,第二个参数是 被注解字段的类。addUserV2接口。

2024-03-01 15:30:09 981

原创 Java设计模式——桥连模式

桥接模式简单来说就是通过将抽象部分和具体部分分离,使它们可以独立地变化。如果你的一个类存在多个变化维度(如抽象和具体的实现)。若使用继承来处理这些变化,将会导致类层次结构的急剧增加,难以管理和维护。并且,继承会将抽象部分和具体部分紧密耦合,不利于独立地进行扩展和变化。此时不妨考虑使用桥连模式。假定一个不同的级别信息发送方式的例子。

2024-02-29 22:08:13 636

原创 Java设计模式——模板方法模式

当你在设计一个业务功能时,有一些方法/算法的结构是固定的,但其中的某些步骤可能会因不同的情境而发生不同的变化。你希望固定核心结构部分,然后灵活的去定制一些特定的步骤。这个时候可以考虑使用模板方法,通过定义一个抽象的父类,其中包含了方法/算法的核心结构,但某些步骤使用抽象方法或受保护的虚拟方法来表示,这些方法由子类来实现。这使得子类可以在不改变核心方法的同时根据需要重写特定的步骤。父类中的模板方法调用这些步骤,确保算法的整体流程一致。假定一个网课流程的例子。

2024-02-26 23:13:11 485

原创 Springboot集成Druid实现监控功能

Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒杀一切。Druid可以很好的监控DB池连接和SQL的执行情况,天生就是针对监控而生的DB连接池。1、数据源页面:是当前DataSource配置的基本信息,上述配置的Filter可以在里面找到,如果没有配置Filter(一些信息会无法统计,例如“SQL监控”,会无法获取JDBC相关的SQL执行信息)。

2024-02-22 19:20:41 1157

原创 Java设计模式——责任链模式

当一个请求需要在多个对象之间传递,每个对象都可能处理该请求或将其传递给下一个对象。在这种情况下,需要避免将发送者与接收者之间的耦合,以及确定请求的处理方式。此时可使用责任链模式,它的优点有降低耦合度(无需关心哪个对象会处理请求),灵活性(可以动态地改变它们之间的顺序和职责),可扩展性(添加新的处理者,而不会影响现有代码),可维护性(处理者之间职责分开,便于维护);责任链模式也有限制,比如可能导致请求无法被处理或者处理链太长而导致性能问题。假定一个权限认证的例子。二、与建造者模式相结合。

2024-02-20 22:22:16 859

原创 Java设计模式——策略模式

在软件系统可能需要根据不同的情境或条件使用不同的算法或行为,但是这些算法的选择和使用可能会频繁变化。在一个类中或许可以通过一系列的条件判断去区分算法的使用,但是这就会导致代码的臃肿不堪,难以维护和扩展。这时我们需要一种方式来灵活地选择和切换不同的算法。这时就可以考虑策略模式,它的主要优点是实现了算法的解耦,使得算法可以独立于客户端而变化。它提高了代码的可维护性和扩展性,因为新的策略可以很容易地添加到系统中。然而策略模式也可能导致类的数量增加,因为每个算法都需要一个对应的策略类。假定一个支付方式选择例子。

2024-02-20 21:47:36 788

原创 Springboot集成jasypt实现配置文件加密

简单配置流程为配置文件加入秘钥配置项jasypt.encryptor.password(这里演示不使用这种方式,采用启动时-D参数注入,也可以放在配置中心等地方进行读取),并将需要加密的value值替换成预先经过加密的内容ENC(密文)。在springboot启动类上加上启动参数 -Djasypt.encryptor.password=qwer1997,添加方式和测试类一样 ,启动项目没有发生报错,调用查询接口查询一下数据,数据正常返回,说明集成成功。我们以单密钥对称加密方式为例简单演示一下。

2024-02-05 14:50:42 525

原创 Springboot简单设计两级缓存

如果是分布式环境下,一级缓存之间也会存在一致性问题,当一个节点下的本地缓存修改后,需要通知其他节点也刷新本地缓存中的数据,否则会出现读取到过期数据的情况,这一问题可以通过类似于Redis中的发布/订阅功能解决。定义一个注解,用于添加在需要操作缓存的方法上,使用cacheName + key作为缓存的真正key,timeOut为可以设置的二级缓存Redis的过期时间,type是一个枚举类型的变量,表示操作缓存的类型。但是在设计中,还是要考虑一些问题的,例如数据一致性问题。在yml中配置redis的相关信息。

2024-01-31 20:28:12 1011

原创 Springboot集成Javamelody监控

JavaMelody的目标是监视QA和生产环境中的Java或Java EE应用服务器。它不是模拟用户请求的工具,而是根据用户对应用程序的使用情况来衡量和计算应用程序实际操作的统计信息的工具。详细介绍请参考https://github.com/javamelody/javamelody/wiki/UserGuide。以方式二集成的结果为例,启动服务后访问http://localhost:8081/config/monitoring。方式二、使用javamelody原生的包。基于更有限的响应时间进行优化。

2024-01-31 11:54:46 484

原创 Springboot常见跨域解决方案

当修饰方法时,表示此方法可以跨域,使用此方式只能实现局部跨域,当一个项目中存在多个类的话,使用此方式就会比较麻烦(需要给所有类上都添加此注解)。此方式是解决跨域问题最原始的方式,但它可以支持任意的 Spring Boot 版本(早期的 Spring Boot 版本也是支持的)。但此方式也是局部跨域,它应用的范围最小,设置的是方法级别的跨域。重写 ResponseBodyAdvice 接口中的 beforeBodyWrite(返回之前重写)方法,此实现方式也是全局跨域,它对整个项目中的所有接口有效。

2024-01-30 10:20:51 415

原创 Springboot优雅实现对接口返回统一封装

前端在调用后端接口时往往不同的接口返回的数据是不一样的,但是通常我们会与前端约定一个固定的返回格式,通过固定的格式告诉他们什么时候接口是返回成功,什么时候返回失败,返回成功后他们如何拿到接口返回的数据去渲染前端页面。所以我们需要定义一个统一的标准返回格式的。我们发现delete的方法返回的json格式没有格式化,我们只需要稍加改造一下delete方法就能正常返回格式化的数据。对于一些不想返回固定包装的方法可以在方法上加上@IgnoreAutoResponse注解即可返回原始的格式。

2023-12-20 15:21:32 861

原创 自定义Jpa代码生成器

实现方式就是使用freemarker模板技术,预先定义我们需要生成的文件,如entity,dto,dao,service,serviceImpl,controller,然后通过获取数据库中的表和列信息,填充模板中的参数内容最后输出java文件。2、定义一个基础类,基础类中定义了数据库表的共有列字段,如id,更新人,更新时间,审核人,审核时间,审核状态,通过使用@PrePersist注解修饰的方法,每次给更新时间和审核时间设置默认值,业务代码中不需要再做处理。4,数据模型实体,表格信息和列信息。

2023-11-24 15:38:52 506

原创 Java实现树形结构和递归查询

树形结构的数据一般是利用类似于id和parent_id之前的关系来构造,以部门为例,当前部门的信息中需要知道自己的部门编号和上一级的部门编号,才能构造出树形结构的数据,先准备好能够构造树形结构的数据。部门的基础实体和部门树实体。编写一个测试类运行查看效果。

2023-11-07 14:10:25 303

原创 linux(centos7)上部署jdk1.8

第一步:准备好jdk的安装包,放在服务器上指定位置,或者使用wget命令去相关链接下载第二步:解压tar -xzvf jdk-8u181-linux-x64.tar.gz第三步:然后配置环境变量vim /etc/profile,进入文件按下i,便进入编辑模式,在文件底部添加export JAVA_HOME=/usr/java/jdk1.8.0_144export JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${

2021-03-30 14:50:32 161

原创 linux(centos7)上部署nginx-1.9.9

第一步:选择自己想要安装的位置,创建nginx的相关文件夹,然后执行wget https://nginx.org/download/nginx-1.9.9.tar.gz第二步:解压 tar -zxvf nginx-1.9.9.tar.gz,解压后进入解压后的文件中如 cdnginx-1.9.9第三步:执行./configure --prefix=/opt/tools/nginx/nginx-1.9.9 --conf-path=/opt/tools/nginx/nginx-1.9.9/nginx.c.

2021-03-30 14:45:33 239

原创 linux(centos7)上部署redis-5.0.9

第一步:在服务器上建好相应的redis文件夹,然后进入文件夹中执行wget http://download.redis.io/releases/redis-5.0.9.tar.gz第二步:然后解压tar -zxvf redis-5.0.9.tar.gz第三步:解压完毕后在redis-5.0.9的目录下执行make命令,有时会出现报错,这里我遇到的报错是这些:<1>,/bin/sh: cc: 未找到命令解决方式:切换为root用户,使用yum install gcc-c++ -y命

2021-03-30 14:29:40 226

原创 zuul实现对post请求参数基于RSA的统一解密

编写一个RSA的加密解密工具类,我这边项目时前后端分离的,所以加密由前端那边完成使用的是jsEncrypt的分段加密,后端进行统一解密操作,防止信息泄露以及SQL或脚本参数入侵,后端生成公私钥,私钥留作解密,公钥给到前端进行加密/** * RSA算法 加密解密 * * @author: YuanXing on 2021/03/08 */public class RSAUtils { /** * 加密算法RSA */ public static final

2021-03-12 10:51:57 447 2

原创 Springboot整合Elasticsearch初体验

我使用的是springboot的2.3.5.RELEASE版本和Elasticsearch的7.6.0版本,这里贴出Elasticsearch的依赖,其它的依赖按照自己的需求自行添加。<!-- elasticsearch start --><dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-c

2021-02-09 21:02:53 223

原创 Java实现图片添加水印文字

项目中遇到要在图片上添加水印文字,类似于像生日贺卡那种推送,就是有一张底图,然后我们需要动态替换掉上面名字,性别,部门啥的给公司人员推送一个生日祝福,一开始使用富文本和一些html转图片的工具来做,发现效果不佳,许多样式无法识别等等,后来还是决定使用Java自带的Graphics2D来实现,通过坐标来控制位置,但是颜色和字体那些可能没有前端那么丰富,简单分享一下吧。水印实体/** * 水印辅助类 * * @author: YuanXing on 2021/01/16 */@Datapu

2021-01-27 09:36:15 468

原创 Springboot整合EasyExcel实现Excel导入导出

引入easyExcel依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version></dependency>EasyExcelUtil/** * EasyExcel工具类 * * @author: YuanXing on 2020/1.

2020-12-23 20:46:00 1204 1

原创 关于mybatis-plus-generator的简单使用

在springboot项目中集成mybatis-plus是很方便开发的,最近看了一下plus的文档,简单用一下它的代码生成器,首先在一个简单的springboot项目中加入如下依赖<!-- 引入mybatis-plus依赖 --><dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> &l

2020-08-25 10:34:57 4655

原创 Java中节点字符串转换,用于SQL排序

在实际开发中我们可能会遇到有节点字段的数据(例如1.1;1.2.1;3.1.2;2.6.3;1.10.1;1.10.1.2),需求中可能还要对节点字段进行升序,或者倒序的排序,这样的话SQL中现成的排序是做不到的,当然可以自己写函数实现,也可以在Java代码中自定义排序方法,我这里建议在我们表字段添加一个节点排序字段(将1.1转换成001001这种类似的字段保存起来便于排序使用),名称你们随意起,知道作用就行,下面写一个字符串转换的方法。public class TestUtil { pub

2020-07-07 11:45:55 298

原创 MySQL拆分字符串和递归查询

最近遇到一个需求,要将数据对市级进行汇总,但是由于系统数据都是很老了的,而且一个字段上存着xxx省/xxx市/xxx区这种数据,但是我们只需要根据市进行相关汇总操作,所以自己写一个函数把原来的字段的值拆分出来只返回xxx市,废话不多说看一下代码吧//先创建一个临时表CREATE TABLE `temp_prepare` ( `area_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '区域名称', `source_id`

2020-06-18 14:14:09 675

原创 SpringBoot使用freemarker动态生成word文档

最近做项目有个需求,在动态生成word文档的同时插入电子签名图片,这里使用freemarker来实现。首先引入freemarker依赖:<!-- freemarker --><dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version>&lt

2020-06-10 11:20:49 898

原创 MySQL对某个字段重复数据的查询,删除,与合并

一,对于部门表部门编号重复的数据,进行相关操作-- 先查看部门信息原表的数据select * from t_dept;-- 查询出所有d_no有重复的数据(没有重复的不显示,即104在表中只有一条,所以不显示)select * from t_dept td where td.d_no in (select t1.d_no from t_dept t1 group by t1.d_no having count(1) > 1);-- 查询出所有d_no有重复的数据(只显示.

2020-06-02 10:56:38 1305

原创 SpringBoot对SpringMvc的自动装配

面试中很容易被问到SpringBoot对SpringMvc的自动装配这个问题,最近看了一些资料,自己稍微总结了一下SpringBoot对SpringMvc做了很多集成,也就是自动装配,下面来浅读一下WebMvcAutoConfiguration这个配置类1,视图解析器的ContentNegotiatingViewResolver作用是根据方法的返回值决定是转发还是重定向,存在一个视图解析器的集...

2020-04-27 17:48:53 467

原创 Springboot整合RabbitMQ发邮件

分享一下在springboot中整合rabbitmq来发送邮件,这一玩也是完了两小时,一步一个坑。。。关于rabbitmq的介绍就不说,先引入依赖<!-- 邮件 依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-b...

2020-04-16 17:20:16 894

原创 Springboot整合Easy Excel自定义导出模板

我是用的springboot,基本jar包不多说,加入Easy Excel的jar包<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.1.2-beta5</ver...

2020-03-28 10:28:46 3771

原创 Mybatis调用程序包或者存储过程

mybatis的mapper.xml文件里面可以写各种各样的SQL,其中CRUD标签中有一个属性那就是statementType,它有三个值:1、STATEMENT:直接操作sql,不进行预编译,获取数据:$—Statement实现动态传入表名、列名:sql里的属有变量取值都改成${xxxx},而不是#{xxx} <selete id="dbCode" parameterTyp...

2020-01-04 14:59:53 544

原创 Springboot全局异常处理从配置文件中读取自定义异常信息

自定义异常的教程社区上有很多,今天抽空研究了一下把自定义的异常信息写到配置文件中,自我感觉这样便于使用与维护,下面简单分享一下1,springboot常用的pom依赖就不列出来了,这里我加了一个依赖 <!-- commons组件读取配置文件相关依赖 --> <dependency> <groupId>commons-configuration...

2019-12-31 16:31:59 1116

原创 使用Mybatis实现树查询

我们的项目中经常都需要用到树查询,今天简单的写一个关于部门的树查询1,首先在准备好部门表以及相应的部门实体public class SysDepartment implements java.io.Serializable { //id private String id; //部门编号 private String deptCode; //部门名...

2019-12-27 10:52:25 1365 2

原创 Java设计模式——建造者模式

所谓建造者模式就是将复杂对象的构建过程与其表示分离,使得同样的构建过程可以产生不同的表现形式。例如我们玩游戏时玩家每次游戏可以选择玩不一样的英雄,而这些英雄会有共同的一些属性如,名称,等级,角色,我们每次不用管内部是如何构造英雄的,只需要拿到不同英雄就可以,简单看下的代码。/** * 英雄的实体 */public class Hero { private String n...

2019-10-09 15:25:22 146

原创 Java设计模式——单例模式

特点:单例类只能有一个实例单例类必须自己创建自己的唯一实例单例类必须给所有其他对象提供这一实例实现单例模式:饿汉式:在类加载时完成初始化(立即加载),所以线程安全懒汉式:在类加载时不会初始化(延时加载),在多线程的情况下会产生多个single对象静态内部类实现1,饿汉式的两种方式/** * 饿汉式1 */public class Singleton { ...

2019-10-07 16:34:11 178

原创 Java设计模式——抽象工厂模式

假设一家4s店卖宝马和大众两种汽车,并且车种分为轿车和卡车两种,像这种工厂产品来自多个等级结构的,简单工厂和工厂方法难以实现需求,这时我们可以使用抽象工厂来实现。下面看一下代码的简单实现;1,先定义轿车和卡车的接口//轿车public interface Sedan { public void run();}//卡车public interface Truc...

2019-10-07 14:17:25 216

原创 Java中final,finally,finalize的区别

一,final修饰符(可作用在类,方法,变量上)1,final 类:final 类不能被继承,没有类能够继承 final 类的任何特性。2,final 方法:类中的 final 方法可以被子类继承,但是不能被子类修改。声明 final 方法的主要目的是防止该方法的内容被修改。3,final 变量:一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。final 修饰符...

2019-08-22 11:24:36 155

原创 Java内部类和匿名内部类

一,内部类:类内部的类就是内部类,就是把一个类定义在另一个类中,那么内部的类就是内部类,内部类不能直接创建,创建方式为外部类.内部类 变量名 = new 外部类对象.new 内部类对象内部类的特点:1,本类可以直接创建内部类对象2,内部类对象可以访问外部类的属性和方法package interior;public class TestInner { public stati...

2019-08-17 21:31:35 115

原创 Java反射

反射:反射机制是在运行状态中1,对于任意一个类都能知道它的所有属性和方法2,对于任意一个对象都能调用它的所有方法和属性反射的功能:1,在运行时判断任意一个对象所属的类2,在运行时构造任意一个类的对象3,在运行时判断任意一个类所具有的的成员变量和方法4,在运行时调用任意一个对象的方法5,生成动态代理获取反射对象的三种方式(Class为反射的入口,本质上讲,一个对象对应的一个不变...

2019-08-16 14:13:38 171

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除