- 博客(159)
- 资源 (9)
- 收藏
- 关注
原创 jackson 轻松搞定接口数据脱敏
实际的业务开发过程中,我们经常需要对用户的隐私数据进行脱敏处理,所谓脱敏处理其实就是将数据进行混淆隐藏,例如下图,将用户的手机号、地址等数据信息,采用进行隐藏,以免泄露个人隐私信息。如果需要脱敏的数据范围很小很小,甚至就是指定的字段,一般的处理方式也很简单,就是写一个隐藏方法即可实现数据脱敏。如果是需求很少的情况下,采用这种方式实现没太大问题,好维护!但如果是类似上面那种很多位置的数据,需要分门别类的进行脱敏处理,通过这种简单粗暴的处理,代码似乎就显得不太优雅了。
2024-08-14 23:27:10 413
原创 Sharding Sphere:轻松搞定数据加解密,支持字段级!
在实际的软件系统开发过程中,由于业务的需求,在代码层面实现数据的脱敏还是远远不够的,往往还需要在数据库层面针对某些关键性的敏感信息,例如:身份证号、银行卡号、手机号、工资等信息进行加密存储,实现真正意义的数据混淆脱敏,以满足信息安全的需要。字段,根据常规,很容易想到使用数字类型,但是却不是,要知道加密之后的数据都是一串乱码,数字类型肯定是无法存储字符串的,因此在定义的时候,这个要留心一下。废话不多说了,直接撸代码!采用配置方式,最大的好处就是直接通过配置脱敏列就可以完成对某些数据表字段的脱敏,非常方便。
2024-08-14 23:22:35 500
原创 validator 实现全注解式的数据校验
默认的情况下,依赖包已经给我们提供了非常多的校验注解,如下!JSR 提供的校验注解!Hibernate Validator 提供的校验注解但是某些情况,例如性别这个参数,可能需要我们自己去手动验证。其实,我们也可以自定义一个注解来完成参数的校验,也便于进一步了解注解验证的原理。自定义注解验证,实现方式如下!首先,创建一个Sex注解。String message() default "性别值不在可选范围内";Class<?Class<?然后,创建一个类,实现自接口@Override。
2024-08-14 23:15:50 934
原创 Spring注入还可以这样玩!涨知识了
上面示例中如果注入的CommonDAO字段上没有添加@Qualifier注解,那么程序将会报错,这里通过@Qualifier注解来限定注入的值;在上面CommonDAO的注入中如果你泛型使用的Student那么注入的将是StudentDAO,如果是Teacher类型,那么注入的将是TeacherDAO。除了上面的方式限定注入的值,我们还可以自定义注解,指定更多的属性值去匹配bean对象,只有bean对象具有相同的属性值(元数据信息)才能匹配。这时候你就可以自定义不同的注解分别标准你要注入的值。
2024-08-14 23:10:46 458
原创 Spring Boot 3太强:全新Controller接口定义方式
注意:这里的RestClient必须使用Spring6.1以上版本,如果你不是那你可以换成RestTemplate.以上是在Spring MVC中定义API接口的几种方式(纯Servlet就算了)。接下来我将介绍另外一种定义Controller接口的方式。该注解将一个类或具体方法声明为HTTP 接口。接口的细节通过注解的属性以及方法参数定义。还是使用上面的PersonService接口定义,通过该接口生成代理类。的主要目的是使用生成的代理抽象HTTP客户端代码。在接口中声明一个默认的方法。
2024-08-10 12:56:12 387
原创 提升系统吞吐量,详解JDK21虚拟线程,炸裂
当前实现虚拟线程的一个限制是,在同步的块或方法内部执行阻塞操作会导致JDK的虚拟线程调度器阻塞一个操作系统线程,而在同步的块或方法外部执行阻塞操作则不会。虚拟线程和传统线程(平台线程)的主要区别在于,可以很容易地在同一个Java进程中运行大量甚至数百万个活动的虚拟线程。阻塞平台线程的代价是昂贵的,因为它会占用线程——这是一种相对稀缺的资源——而线程并没有做很多有意义的工作。线程是可以调度的最小处理单元。平台线程在其底层操作系统线程上运行Java代码,平台线程在平台线程的整个生命周期中捕获其操作系统线程。
2024-08-10 12:53:59 921
原创 Spring6.2震撼来袭,多线程实例化Bean应用启动速度飙升!
在最新的Spring6.2.0-SNAPSHOT版本中,一项引人注目的新功能被引入——Parallel Bean Initialization during Startup,即启动过程中的并行Bean初始化。在传统的Spring应用程序中,Bean的初始化通常是按照特定的顺序进行的,这在一定程度上限制了启动过程的并行性,影响了启动速度。然而,在Spring6.2.0-SNAPSHOT版本中,通过引入并行Bean初始化功能,Spring框架能够同时初始化多个Bean,从而显著减少启动时间。
2024-08-10 12:24:04 281
原创 警惕!SpringBoot错误发布事件,造成死锁Deadlock
不要在构造函数中发布事件,而是应该在所有的单例对象都创建完后再执行,也就是实现SmartInitializingSingleton接口,该接口对应的回调方法会在所有的单例bean都创建完以后执行,这样就不会再出现deadlock问题。升级Spring版本到Spring6.2(目前并没有正式发布),你仍然可以使用6.2.0-SNAPSHOT版本,该版本通过多线程方式初始化Bean对象,这样就不会出现deadlock问题。该Bean在构造函数中新启一个线程发布事件,同时通过join方法等待线程执行完成。
2024-08-10 12:22:28 402
原创 SpringBoot高级开发技巧
通过监听ServletRequestHandledEvent事件,可以有效的获取客户端地址,请求的URL等完整的信息,其中ProcessingTimeMillis属性反应的就是这个请求耗时情况。虽然达到了目的,但是这将所有web分组的日志都进行输出了,日志信息非常多,我们所期望的仅仅是输出Controller相关的信息。通过上面的设置,此时日志信息只输出了Controller接口,其它的都按照默认的输出。以上是默认的路径,我们可以在这自定义自己的今天资源路径。通过监听该事件,你可以在这里实现你自己的逻辑。
2024-08-10 12:19:20 364
原创 Spring Cloud Gateway自定义谓词及网关过滤器
Spring Cloud Gateway 同样提供了一系列的内置过滤器,但同样,如果你需要实现特定的业务逻辑或自定义处理,你可以创建自定义的网关过滤器工厂。然而,如果你需要实现一些特定的业务逻辑或自定义条件,你可以创建自定义的谓词工厂。Spring Cloud Gateway 的自定义谓词工厂和网关过滤器工厂为开发者提供了灵活性和扩展性,使得开发者可以根据业务需求自定义路由条件和请求处理逻辑。例如,你可以创建一个自定义网关过滤器工厂来记录每个请求的详细信息,或者根据特定的业务逻辑修改响应的内容。
2024-08-10 12:15:51 372
原创 Spring一个强大便捷的代理工厂类
但如果你需要一种更加灵活和可配置性,那么Spring还提供了一个非常方便强大的ProxyFactoryBean类,该类特别适合那些需要更多自定义和控制的场景,例如当你需要为特定的Bean创建代理,或者需要在不修改原始代码的情况下为现有类添加额外的功能时。在Spring框架中,AOP(面向切面编程)是一种强大的编程范式,它允许开发者在不修改原有代码的情况下,为程序添加额外的功能,如日志记录、事务管理、安全控制等。在上面配置拦截器时,我们都是指定的具体拦截器,其实我们还可以使用通配符,指定拦截器。
2024-08-10 12:04:22 365
原创 整合RSocket实时数据通信
服务器可能会拒绝 SETUP 帧,但一般情况下,在发送(客户端)和接收(服务器)SETUP 帧后,双方都可以开始发出请求,除非 SETUP 表示使用租用语义来限制请求数量,在这种情况下,双方都必须等待另一端发出 LEASE 帧才能允许发出请求。虽然所有报文都可以包含元数据,但路由等元数据通常是按请求提供的,因此只包含在请求的第一条报文中,即 REQUEST_RESPONSE、REQUEST_STREAM、REQUEST_CHANNEL 或 REQUEST_FNF 框架之一。数据和元数据可以有不同的格式。
2024-08-10 11:55:05 1287
原创 通过编程式事务提高系统性能
编程式事务允许开发者在代码中明确控制事务的边界、启动、提交和回滚等操作,从而确保数据的一致性和完整性。这里http接口调用的操作不应该放到一个事务中操作它和数据库就没有关系,但是它的耗时越长就会对当前的数据库连接占有更长的时间对系统的整体性能是有影响的。接下来将对编程式事务的应用进行详细的介绍。参数,该接口是一个函数式接口,我们只需将需要在事务上下文中执行的代码放入方法中即可。该类是基于响应式编程中应用的编程式事务,这里就不做介绍了。接下来分别通过不同的方式对编程式事务进行详解的讲解。
2024-08-10 11:52:14 721
原创 Spring为什么不支持static字段注入
通过上面的源码得知,在进行类字段/方法解析时就会判断相应的注解是否是静态的,如果是则直接抛出异常(此时是还没有进入到注入阶段)。同样该注解的处理器与@Resource注解的处理器直接阶段是一样的,都是没有真正的进入注入阶段。首先,我们来确认一下,在Spring框架中,是否不允许对静态字段和方法进行注入的各种使用方式。与静态字段注入一样,抛出了非常明确的错误不支持静态方法的注入。错误直接就提示了@Resource不支持静态字段的注入。方法注入与上面的情况是一样的。构造函数注入,不需要任何的注解。
2024-08-10 11:38:50 362
原创 玩转Redis!非常强大的Redisson分布式集合
该对象完全线程安全。支持本地缓存的地图对象实现了RLocalCachedMap,它扩展了 java.util.concurrent.ConcurrentMap 接口。通过使用Redisson,开发者可以像使用传统Java集合类一样,在分布式系统中进行数据的增删改查操作,而无需担心数据在不同节点之间的同步和一致性问题。基于 Redis 的 Java 分布式无界队列对象,实现了 java.util.Queue 接口。Redisson提供了很多分布式的队列实现,如还有双端队列,优先级队列等,这里就不一一展示了。
2024-08-10 11:34:27 510
原创 SpringBoot 第三方接口调用
无论是RESTful API调用、Feign声明式HTTP客户端、Apache HttpClient等调用方式,每种方式都有其适用场景和优势,选择最适合的方式将有助于提高开发效率和系统性能。RestTemplate是我们项目中最为常用的接口调用方式了,它以经典 Spring Template 类的形式为 HTTP 客户端库提供了高级 API。Apache HttpClient 5是一个支持HTTP/2、高度可定制、支持异步请求的开源HTTP工具包,提供了丰富的API和扩展特性。方法的 Java 接口。
2024-08-10 11:21:24 543
原创 Controller接口参数这样玩
指定在发生重定向时使用的属性(即要附加到查询字符串中的属性)以及要在重定向请求期间临时存储的属性。如果你的请求是multipart/form-data,那么你可以通过如下方式获取部分请求信息。如果你想获取当前请求的Schema,Host,Port,上下文,那么你可以通过如下参数获取。本身提供了很多通用的方法,并且还可以获取其它对象,使用起来更加方便。你还可以非常方便的获取当前请求Method及Locale等信息。通过该种方式,重定向后页面中也能获取设置的属性信息。除此之外,你还可以获取时区信息。
2024-08-10 11:18:43 290
原创 程序退出码
然后,在需要的时候,可以调用SpringApplication#exit方法并传递相应的 ApplicationContext 和ExitCodeGenerator实例来触发应用程序的退出,并返回由 ExitCodeGenerator生成的退出代码。你可以根据不同的退出码,执行相应的动作,如:资源清理,日志记录等。上面示例定义了3个ExitCodeGenerator Bean实例,当调用退出方法时,会遍历这3个Bean对象,通过正常的代码调用退出方法。System.err.printf(“初始化错误退出…
2024-08-10 11:12:39 645
原创 启动后运行特定的代码
通过上面的输出对比,ApplicationRunner对参数的操作方法更加的完善不仅包括了完整原始的参数信息,还将提供了其它获取所有参数名及参数名对应的值(上面并未调用对应方法。如果你项目中有多个Runner实现,并且希望按照一定的顺序执行,那么你可以通过如下方式定义执行顺序。以上案例,都有其它的处理方式,这里只是给大家演示这里的Runner都能做些什么。这两个类的方法名都是run,仅仅是他们的参数不同,接下来查看具体参数有何不同。首先,在启动程序时添加如下参数。应用启动后,执行定时任务。
2024-08-10 11:03:44 211
原创 单例设计模式
单例设计模式一、类加载与static1.1. 类加载顺序1.2. static关键字二、 单例设计模式2.1. 饿汉式(可用)2.2. 普通懒汉式(线程不安全,不可用)2.4. 双重检查懒汉式(可用,推荐)2.5. 静态内部类(可用,推荐,线程安全)2.6. 枚举(可用,推荐)一、类加载与static1.1. 类加载顺序先执行父类的静态代码块和静态变量初始化,静态代码块和静态变量的执行顺序跟代码中出现的顺序有关。执行子类的静态代码块和静态变量初始化。执行父类的实例变量初始化执行父类的构造函数
2021-03-21 18:34:39 163
原创 Spring 5 新特性总结
Spring 5 新特性总结一、 升级到Java SE 8 和 Java EE 7将Java8作为最低的JDK版本。Spring5在类路径(和模块路径)中完全兼容Java9,而且它通过了JDK9测试套件的测试。在API级别上,Spring5兼容Java EE8技术,满足对Servlet4.0、Bean Validation2.0和全新的JSON Binding API的需求。对Java EE API的最低要求为V7,该版本引入了针对Servlet、JPA和Bean Validation API的次
2021-01-17 16:54:15 1677
原创 合成复用原则
合成复用原则合成复用原则:是指尽量使用对象组合(has-a)/聚合(contanis-a)而不是继承关系达到软件复用的目的。可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。继承叫作白箱复用,相当于把所有的实现细节暴露给子类。组合/聚合称为黑箱复用,我们是无法获取到类以外的对象的实现细节的。虽然我们要根据具体的业务场景来做代码设计,但也需要遵循OOP模型。以数据库操作为例,先来创建DBConnection类:public abstract class DBConnec
2020-09-19 14:56:20 337
原创 迪米特原则
迪米特原则迪米特原则:是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则,尽量降低类与类之间的耦合度。迪米特原则主要强调:只和朋友交流,不和陌生人说话。出现在成员变更、方法的输入、输出参数中的类都可以称为成员朋友类,而出现在方法体内部的类不属于朋友类。现在来设计一个权限系统,Boss需要查看目前发布到线上的课程数量。这时候Boss要找到TeamLeader去进行统计。TeamLeader再把统计结果告诉Boss。接下来我们还是来看代码:根据迪米特原则,Boss只想要结果,不需要跟Course
2020-09-19 14:21:08 1200 1
原创 接口隔离原则
接口隔离原则接口隔离原则:是指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。设计接口时应该注意以下几点:一个类对另一个类的依赖应该建立在最小的接口之上建立单一接口,不需建立庞大臃肿的接口尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)下面我们来看一段代码,对一个动物行为进行抽象描述:IEatAnimal接口的代码如下:public interface IEatAnimal { void eat();}IFlyAnimal接口的代码如下:
2020-09-19 14:03:38 161
原创 单一职责原则
功能职责单一原则错误代码示例:Course 类承担了两种处理逻辑。假如现在要对课程进行加密,直播课程和录播课程的加密逻辑不一样,必须修改代码。而修改代码的逻辑势必会相互影响,容易带来不可控的风险。public class Course { public void study(String courseName){ if("直播课".equals(courseName)){ System.out.println(courseName + "不能快进");
2020-09-14 22:14:48 117
原创 依赖倒置原则
依赖倒置原则依赖倒置原则是指设计代码结构时,高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性,并且能够降低修改程序所造成的风险。创建一个课程的抽象ICourse接口:public interface ICourse { void study();}编写JavaCourse类:public class JavaCourse implements ICourse {
2020-09-14 21:40:17 179 1
原创 开闭原则
开闭原则开闭原则是指一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。它强调的是用抽象构建框架,用实现扩展细节,可以提高软件系统的可复用性及可维护性。开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定、灵活的系统。例如版本更新,我们尽可能不修改源代码,但是可以增加新功能。以学院课程体系为例,首先创建一个课程接口 ICourse:public interface ICourse { Integer getId();
2020-08-19 14:09:21 139
原创 依赖注入
面向接口编程依赖注入是面向接口编程的一种体现,是Spring的核心思想。 事实上依赖注入并不是什么高深的技术, 只是被Sping这么以包装就显得有些神秘。class Main { interface Language { void print(String s); } static class Java implements Language{ ...
2019-11-30 11:04:18 271
原创 Spring获得DataSource
一、从JNDI获得DataSource1.1、Spring JNDI数据源配置信息<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jc...
2019-11-30 10:31:39 579
原创 MySQL 性能优化
一、什么是慢查询?慢查询是 MySQL 中提供的一种慢查询日志,它用来记录在 MySQL 中响应时间超过阀值的语句,具体指运行时间超过 longquerytime 值的 SQL,则会被记录到慢查询日志中。longquerytime 的默认值为 10,意思是运行 10S 以上的语句。默认情况下,MySQL 数据库并不启动慢查询日志,需要我们手动来设置这个参数,如果不是调优需要的话,一般不建议启动该...
2019-11-24 20:42:05 122
原创 MySQL 索引的面试题总结
一、使用索引注意事项使用短索引,短索引不仅可以提高查询速度,更能节省磁盘空间和 I/O 操作;索引列排序,MySQL 查询只使用一个索引,因此如果 where 子句中已经使用了索引的话,那么 order by 中的列是不会使用索引的,因此数据库默认排序可以符合要求的情况下,不要进行排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引;like 语句操作,一般情况下不鼓励使用...
2019-11-21 00:08:14 443
原创 MySQL 基础模块的面试题总结
一、说一下 MySQL 执行一条查询语句的内部执行过程?客户端先通过连接器连接到 MySQL 服务器。连接器权限验证通过之后,先查询是否有查询缓存,如果有缓存(之前执行过此语句)则直接返回缓存数据,如果没有缓存则进入分析器。分析器会对查询语句进行语法分析和词法分析,判断 SQL语法是否正确,如果查询语法错误会直接返回给客户端错误信息,如果语法正确则进入优化器。优化器是对查询语句进行优化处...
2019-11-20 22:26:28 360
原创 Build模式
一、简介Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来,两者之间的耦合度也降到最低。二、使用场景初始化一个对象,并且这个对象有非常复杂的参数设置,如下所示:public class Swagger2 { @Bean ...
2019-11-19 22:26:20 167
原创 SpringBoot1.X——MockMvc单元测试
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = MockServletContext.class) @WebAppConfiguration public class ApplicationTests { private MockMvc mvc; @Before...
2019-11-11 22:44:18 140
原创 SpringBoot1.X——配置文件详解
一、自定义属性1.1、自定义属性与加载com.didispace.blog.name=程序猿DDcom.didispace.blog.title=Spring Boot教程@Componentpublic class BlogProperties { @Value("${com.didispace.blog.name}") private String name; ...
2019-11-11 22:22:01 269
原创 Java 5
一、泛型1.1、通配符类型:避免unchecked警告,问号表示任何类型都可以接受public void printList(List<?> list, PrintStream out) throws IOException { for (Iterator<?> i = list.iterator(); i.hasNext(); ) { out.pri...
2019-10-21 20:48:16 75
原创 Java 7
一、switch中使用Stringjava7以前在switch中只能使用number或enum现在可以使用String了:String s = "a";switch (s) { case "a": System.out.println("is a"); break; case "b": System.out.println("...
2019-10-21 00:33:20 179
原创 Java 8
一、什么是Stream1.1、Stream(流)是一个来自数据源的元素队列并支持聚合操作元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sor...
2019-10-21 00:13:50 596
原创 代理模式
一、什么是代理模式简单说即是在不改变源码的情况下,实现对目标对象的功能扩展。二、动态代理2.1、被代理的接口public interface Demo { void test1(); void test2();}2.2、被代理的对象(实现了被代理接口的对象)public class DemoImpl implements Demo { @Overri...
2019-10-20 15:47:18 93
邮件、toBean、一次性验证码 等
2015-11-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人