自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring是如何加载BeanDefinition的

在Spring加载Bean的过程中是无法感知每个Bean的,也无法知道每一个bean具体的特征,比如某个bean是单例还是原型,是否懒加载等等。所以Spring需要beandefinition来对每个不同的bean进行描述,并不是直接把Bean直接存入容器而是读取成beanDefinition,再根据BeanDefenition对bean的描述进行实例化。那么Spring是如何读取这些BeanDefinition的呢?

2023-02-23 18:01:05 425 1

原创 (三)工作流Activiti7-个人任务查询及完成

在上篇文章中我们已经完成了流程的定义和部署。通过部署并启动流程后就已经开始给每个负责人分配任务了。比如下图:assignee可以写死但一般都是通过变量来设置任务负责人的,在启动一个流程实例的时候就可以将这个emp变量替换成真正的任务负责人。/*** 启动一个流程实例。

2022-10-25 10:42:13 2158

原创 (二)工作流Activiti7流程部署和启动

每当一个任务完成后就会从系统中删除,而在历史表中更新END_TIME字段,比如说请假流程xx科长审批完成,系统就会在task表中删除xx科长的任务信息添加xx部长的审批任务,历史任务表中的xx科长就会更新完成时间,新增xx部长的任务信息。比如请假流程,每一个请假流程都会启动一个请假流程实例,就好比类和对象的关系,流程就是类,启动一个流程就好比创建一个对象。这里我定义了一个请假流程,流程定义文件保存在resource资源目录下的**/bpmn/leave.bpmn20.xml**

2022-10-22 19:11:07 1834

原创 (一)工作流Activiti7基础环境搭建

Alfresco软件在2010年5月17日宣布Activiti业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理BPM的专家 Tom Baeyens担任,Tom Baeyens就是原来jbpm的架构师,而jbpm是一个非常有名的工作流引擎,当然activiti也是一个工作流引擎。

2022-10-20 22:55:31 794

原创 Nacos Config配置中心详解

在微服务的生态中,统一的配置管理也是至关重要的一环,在市场上也有很多的优秀的组件例如SpringCloud Config、Nacos、Apollo等。Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

2022-09-21 18:04:27 3433

原创 Nacos服务注册实现原理

Nacos作为微服务生态核心组件之一,它承担着注册与发现、服务配置的作用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。本章将从源码角度探索Nacos是如何实现服务注册的。

2022-09-20 14:00:04 1683 1

原创 redis实现分布式锁详解

单体项目难以支撑高流量、高访问量的项目。为了降低服务的负载压力,大多数情况下都会把服务拆分集群部署在不同的服务器上。在这种场景下使用常规的JVM锁(Lock/Sync)是有问题的,其他服务是无法感知当前JVM锁的状态的,JVM锁也不能锁其他服务。所以需要一个分布式锁,所有的服务都是用统一的锁。现在比较常用的分布式锁就是redis、zookeeper和mysql。

2022-09-07 22:41:49 2287

原创 从0-1带你手写代码生成器(Java版)

在实际的项目开发中,根据数据库表创建实体、service、controller等结构是一件非常繁琐的事。所以我们经常需要使用到各种代码生成器,例如mybatis-plus,若依等框架都有自己的代码生成器和生成逻辑。本篇文章我们就从0开始,手写一个简单的代码生成器。源码github地址。

2022-09-02 16:52:40 1263

原创 websocket+vue+echarts实现实时动态渲染图表

最近遇到一个需求,需要在前端做一个可视化的图表,并且是实时更新的。但echarts不支持图表的实时渲染。只能通过setOption重新设置。我的实现思路是在页面初始化的时候向后端发起一个websocket请求,后端收到连接后将channel保存起来,每次数据更新或隔段时间就轮询这些channel推送数据。...

2022-08-07 12:35:49 2992

原创 踩坑记录:Netty客户端channel.close后主程序无法停止的问题

在尝试netty客户端主动断开连接,调用channel.close后,正常情况下程序会正常退出。但是我在尝试发送10W条消息到服务端再调用close方法,结果程序还在运行。正一头雾水的时候想到可以用jprofile工具查看还没关闭的线程,就进行调试,结果还真的发现一个Netty的BUG。这个ObjectCleanerThread的线程一直在运行,于是我就找啊找,结果在github上找到了答案,确实是netty的一个bug,不过这个bug在4.1.21已经被修复了。刚好我原先版本时4.1.20…...

2022-07-23 17:40:08 1537

原创 基于Netty手写一款高并发、高性能的消息队列Xy-MQ(一)

在大学时期用过NIO手写消息队列,那时候还不会Netty,用原生的NIO出现了很多问题,例如自定义消息协议后socket无法正常关闭,需要手动修改缓冲区大小等问题。最近刚好学习了Netty,准备用Netty去重写这个消息队列。我将会带着大家从零开始,手写一款高性能、高安全性、持久化的消息队列。源码会同步到Githubhttps感兴趣的可以点个Star!!!在当时Nio编写完成后,就已经拥有超高性能了,每秒钟可以生产和消费消息20000+。高性能、高并发、高可靠性、轻量级的消息队列。......

2022-07-22 17:25:55 1112 1

原创 SpringBoot+SpringSecurity+Vue实现动态权限(四)

在上一篇SpringBoot+SpringSecurity+Vue实现动态权限(三)中已经完成了vue-admin-template的整合以及动态菜单的实现。动态权限大体已经完成了,这一章我们需要修改逻辑,将权限标识存入redis中,后端通过redis中的权限标识来实现权限控制。...

2022-07-18 16:07:43 1444 4

原创 SpringBoot+SpringSecurity+Vue实现动态权限(三)

在上一篇完成了Security登录认证和授权过滤器的编写,后端的登录等功能已经实现。这一篇整合前端Vue实现动态菜单功能。前端Vue项目使用脚手架vue-admin-template

2022-06-25 13:41:49 1676

原创 SpringBoot+SpringSecurity+Vue实现动态权限(二)

在上一篇完成项目的构建后,完成了SpringSecurity获取用户信息和权限信息的逻辑。这一篇要实现SpringSecurity的配置,实现自己的登录认证和授权的逻辑。要完成自定义认证和授权的逻辑,就需要自己实现两个过滤器。这两个过滤器是认证过滤器和接口访问过滤器。分别要继承UsernamePasswordAuthenticationFilter类和BasicAuthenticationFilter这两个类。在UsernamePasswordAuthenticationFilter的实现类中可以定义登录

2022-06-23 15:14:14 1588

原创 SpringBoot+SpringSecurity+Vue实现动态权限(一)

之前都是使用若依框架来实现的动态权限和菜单功能,但是一直想尝试自己来实现动态权限。所以这两天准备整合一下自己的所学知识,依据RBAC权限模型,使用SpringBoot+SpringSecurity+Vue来自己实现一下动态权限。......

2022-06-22 14:38:58 3043 12

原创 SpringSecurity中loadUserByUsername方法无法正常捕获异常的问题

最近在做动态权限,整合了SpringSecurity。在使用SpringSecurity 做用户认证功能的时候,重写了loadUserByUsername方法并且在方法内判断用户是否为空,如果为空就抛出自定义的UserException异常。前端捕获到就反馈相应信息。代码如下:本以为如上代码会正常抛出UserException,但是在测试之后并没有按照预想的走...

2022-06-13 16:44:06 3852

原创 从源码角度解决mybatis报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

看了网上很多解决方法发现并不全,大部分都是检查namespace和标签id是否正确以及是否和方法名对应。首先要说一下报错中的这个statement 就是mappedstatement,在mybatis中一个mappedstatement对应一个或者是其他标签,是一对一的关系。如果检查了namespace和xml配置发现都没问题,就可以怀疑是自己的mapper文件并没有被扫描到。下面是我的排错思路:...

2022-06-10 23:51:29 285

原创 AQS是什么

AQS是java.util.concurrent.locks包中的一个抽象类,全称AbstractQueuedSynchronizer,直译过来就是抽象队列同步器。它是并发用来构建锁和其他同步组件的基础框架。

2022-06-08 14:07:19 1079

原创 java并发编程之Volatile详解

在Java中多个线程对公共变量的操作并不是直接在内存中操作的,每一个线程都会有一块自己的工作内存。线程会先从主内存中获取到变量的值到工作内存中进行修改在更新到主内存。假如有两个线程同时对某个变量进行操作,线程A对变量value进行了更新,还没将值回写到主内存中时,线程B也读取了变量value,就会出现脏读现象。...

2022-06-04 18:32:14 283

原创 java死锁代码演示

前言java中锁是个非常有用的工具,运用的场景非常多,因为它使用起来非常简单而且容易理解。但是如果对锁的使用不当就有可能造成死锁,一旦产生死锁就可能会造成系统不可用。下面使用一段代码来模拟死锁发生的场景。public class DeadLock { private static String A ="a"; private static String B ="b"; public static void main(String[] args) { new De

2022-05-28 21:35:46 2977 2

原创 java虚拟机-G1 回收器笔记

既然我们已经有了前面几个强大的 GC ,为什么还要发布 Garbage First ( G1 ) GC ?原因就在于应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有 GC 就不能保证应用程序正常进行,而经常造成 STW 的 GC 又跟不上实际的需求,所以才会不断地尝试对 GC 进行优化。 G1 ( Garbage-First )垃圾回收器是在 Java 7 update 4 之后引入的一个新的垃圾回收器,是当今收集器技术发展的最前沿成果之一与此同时,为了适应现在不断扩大的内存和不断增加的处理器数

2022-05-19 21:00:57 331

原创 java虚拟机之CMS垃圾收集器

背景·在JDK 1.5时期,HotSpot推出了一款在强交互应用中几乎可认为有划时代意义的垃圾收集器: CMS(concurrent-Mark-Sweep)收集器,这款收集器是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程同时工作。CMS收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间。停顿时间越短(低延迟)就越适合与用户交互的程序,良好的响应速度能提升用户体验。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视

2022-05-18 22:31:22 350

原创 Java中String直接赋值,new String()以及new String(““).intern()的理解

话不多说,直接进入主题。首先是这样一段代码 String s1 = "ab"; String s2 = "ab"; String s3 = "a"+"b"; System.out.println(s1 == s2); // true System.out.println(s3 == s2); // true像s1,s2这种字面量显示赋值,Java会直接在字符串常量池中寻找对应的字符串"ab",如果不存在则新建,否则就直接返回

2022-05-06 23:27:34 3125

原创 Docker中实现Mysql主从复制

需要下载mysql的镜像,下载完成后启动容器mysql-master和mysql-slave两个节点。启动主节点:docker run -p 3306:3306 --name mysql-master \-v /mydata/mysql/log:/var/log/mysql \-v /mydata/mysql/data:/var/lib/mysql \-v /mydata/mysql/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:

2022-04-27 23:26:15 1715

原创 SpringBoot如何扫描启动类所在包及子包

前言当初学习SpringBoot框架的时候发现他只会扫描启动类所在包下和子包。最近刚好在学源码,想要探究为什么是默认扫描启动类所在包,而不是其他路径?我从run方法开始debug。SpringApplication的run方法可以找到SpringBoot的大致启动流程。多的不说,SpringBoot实际上也是依托与Spring的。而注解扫描不可能会放在创建应用上下文阶段的,debug发现在createApplicationContext和prepareContext方法调用后IOC容器中并没有扫描到我

2022-04-06 10:29:25 5130

原创 SpringBoot中ApplicationListener和SpringApplicationRunListener的区别

前言最近在学习SpringBoot源码的时候发现了ApplicationListener和SpringApplicationRunListener两个监听器。一开始很容易将两个监听器混淆。以为都是SpringBoot的监听器。后面才发现他们是在不同的阶段被SpringBoot扫描并实例化的。ApplicationListener加载详解首先ApplicationListener是在SpringApplication类实例化的时候就加载的,Spring会从所有的spring.factories文件中加载

2022-04-01 16:52:09 1643

原创 Springboot自动装配的实现原理

前言相信使用过spring的小伙伴都有过被xml配置支配过的恐惧。每次需要导入新的bean或者第三方依赖时都需要对xml进行繁琐的配置。而在SpringBoot项目中却没有这样的烦恼,我们只需要在pom.xml中导入对应的jar包就能直接对组件进行注入。其原因是SpringBoot已经通过自动配置功能帮助我们将所需要的对象自动引入ioc了。下面我们来对Springboot的自动装配进行探究。@SpringBootApplication我们从主启动类开始探究,每一个Springboot应用的启动类上面都

2022-03-27 22:52:44 435

原创 Spring源码:refresh方法解析

前言在Spring中,refresh方法就是整个框架的核心,也是阅读源码的最合适的入口。这个方法包括了整个Spring的执行流程和bean的完整生命周期。首先从new ClassPathXmlApplicationContext(“xxx.xml”)开始。 public ClassPathXmlApplicationContext( String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)

2022-03-19 16:12:58 2597 2

原创 Spring源码:Bean的初始化

前言Spring中Bean的实例化和初始化都是在doCreateBean中实现的。实例化操作是在createBeanInstance(beanName, mbd, args)方法中实现的。在实例化后会生成一个BeanWrapper对象,这个对象是bean的修饰对象。而进行bean初始化的功能主要是在**populateBean(beanName, mbd, instanceWrapper)**和 **initializeBean(beanName, exposedObject, mbd)**中完成的。po

2022-03-17 21:01:10 734

原创 Spring源码:populateBean方法填充属性(autowireByName、autowireByType详解)

前言Spring框架在doCreateBean方法中进行普通Bean的实例化和初始化。在doCreateBean中调用createBeanInstance()方法创建bean的实例后,会进行一次后置处理器的调用。 // 对bean进行合并后处理,Autowired注解就是通过这个方法实现类型的预解析 synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { try { applyMergedBeanD

2022-03-16 22:18:54 1518

原创 Spring源码解析:三级缓存与循环依赖

循环依赖Spring的循环依赖指的是两个或以上的bean对象互相作为对方的属性,例如A类中存在属性B,B类中存在属性A。Spring在创建实例化A时发现需要注入B类,就先去创建B类,在创建B类时发现需要注入A类,这时候又去寻找A类。这就是循环依赖,如下图:如果按照Spring普通的方式去进行实例化,是不可避免循环依赖的。我们从源码开始,一步一步分析Spring是如何解决循环依赖的。首先是从获取bean开始。我们从doGetBean方法开始进入,注意这个getSingleton(beanName),顾名

2022-03-15 17:00:06 567

原创 Spring源码:Bean的加载流程

1.前置知识Spring通过IO流读取到xml文件后,由BeanDefinitionReader的实现类XmlBeanDefinitionReader对xml文件进行解析。将xml文件中的信息传入BeanDefinitionDocumentReader的实现类DefaultBeanDefinitionDocumentReader转换成Document对象,从beans标签开始一步一步像剥洋葱一样解析各级标签。最终封装在BeanDefinition中。BeanDefinition在通过BeanFactory

2022-03-13 15:41:13 1849

原创 Java设计模式在实际项目中的运用-策略模式

项目背景以前写项目时,登录功能都是按照需求写不同业务逻辑去实现登录,需要大量的if…else判断登录场景。但这种写法拓展性不高,万一哪天要新增支持的登录方式(例如weibo、qq),还需要去改源代码。这时设计模式中的策略模式就可以排上用场了。我在实习的项目中刚好需要实现登录功能,就想到用策略模式实现登录功能,顺便加强自己的印象。先给大家理解一下策略模式的概念。策略模式意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用 if…else 所带来

2022-03-03 15:57:43 858

原创 Springcloud config client中@Value读取不到值的问题

Springcloud config client中读取不到configserver的值/@Value失效(基于Springboot2.4.1+Springcloud2020.0)检查了bootstrap.ymgit上的配置文件名是:config-client-dev.yml所以配置文件没问题。jar包也导入了org.springframework.cloudspring-cloud-config-client启动项目时发现端口号是默认的8080,意识到可能是没有读取到bootstrap.ym

2021-01-24 12:12:47 1647 5

空空如也

空空如也

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

TA关注的人

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