- 博客(92)
- 资源 (3)
- 收藏
- 关注
原创 【数据结构】队列数组实现方式
线性数组实现方案public class LineArrayQueueDemo { public static void main(String[] args) { LineArrayQueue lineArrayQueue = new LineArrayQueue(3); lineArrayQueue.add(10); lineArrayQueue.add(20); System.out.println(lineArrayQue
2022-05-28 22:11:45
399
原创 【数据结构】稀疏数组实现,存在问题:当有效值过多,稀疏数组反而会消耗性能
public class SparseArray { public static void main(String[] args) { int[][] oldArray = new int[11][11]; oldArray[1][2] = 1; oldArray[2][3] = 2; int[][] sparse = saveArray(oldArray); int[][] newArr = readArray(sp
2022-05-28 22:09:06
238
原创 微服务架构,使用spring security,通过PreAuthorize注解控制权限,各个服务读取所有的值,存入数据库
思路:1、首先将此功能写在公共模板,每一个服务都会依赖公共模板,都将获得此功能。2、其次,利用springboot的ApplicationListener机制,监听ApplicationStartedEvent事件(springboot启动完成),利用spring来读取所有的注解的值,然后解析出对应我们想要的值3、然后使用FeignClient调用到远程对应的服务4、存储的时候进行判断,是否已经存在了,如果存在了,就不在添加了各个项目的架构不一致,核心还是获取到注解的所有值,只需要核心关注第一步
2022-02-08 16:50:23
3107
1
原创 redis的基本操作【个人笔记】
列表:可以做一些队列hash:双重mapset:redisTemplate.opsForSet().intersect() // 交集redisTemplate.opsForSet().union() // 并集redisTemplate.opsForSet().difference()// 差集redisTemplate.opsForSet().members() // 获取所有数据
2022-02-02 22:44:01
1536
原创 spring中,使用事件发布功能
自定义事件import org.springframework.context.ApplicationEvent;/** * @Author osy * @Date 2022/1/30 * @Description: TODO **/public class MyEvent extends ApplicationEvent { /** * Create a new {@code ApplicationEvent}. * * @param source.
2022-01-30 10:14:38
258
原创 springboot+redis实现发布订阅模式
引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>自定义监听器,处理订阅后收到的msgimport org.springframework.beans.factory.annotat.
2022-01-29 15:31:17
3864
原创 【批处理统一抛异常】对于批处理,我们可以自定义一个异常,然后里面设置一个集合,直到最后,如果有内容,则统一抛出异常
看spring源码得到的一种编程思想:代码如下: @Override public void validateRequiredProperties() { // 先定义一个异常, MissingRequiredPropertiesException ex = new MissingRequiredPropertiesException(); for (String key : this.requiredProperties) { // 如果有异常的,先将其加入到异常中的某个集合中去,
2022-01-29 00:22:23
572
原创 springboot+数据同步框架canal,将mysql的数据同步到多个地方,比如其他库,redis,es,mq等
现在正在做一个项目,人力资源方面的,有个各个业务都用用户表息息相关,用户服务和其他各个服务相互独立,所以无法进行关联查询,并且业务需要,很多都需要去关联到用户表,所以比较纠结,故有如下方案:方案一:将用户表经常使用到的字段冗余到各个业务表,用户信息修改之后,发送一个消息到mq,然后涉及到冗余用户字段的服务去订阅这个队列,然后进行修改冗余字段数据,其实这个方法也不错。方案二:利用canal,各个服务拆分出去的库都包含用户表。由于项目中需要将一些数据同步到redis和es,使用到了canal,所以利用c
2022-01-27 21:23:00
4982
原创 使用springboot启动监听器ApplicationContextInitializer实现外部jar包设置BeanNameGenerator,解决控制层beanName冲突问题
解决方案直通车注:如果不看解决思路,只看解决方案的,可以滚动到最后面查看解决方案!最新在搭建springcldoualibaba微服务架构,由于习惯了之前的写法(控制层将后台,APP端,小程序端,公众号端分包管理,所以同一个业务的控制器,又懒得每个控制器指定一个名字,对于spring来说,类名一样,那么名字就一样,则会启动报错),则自定义了BeanNameGenerator,之前对于单体springboot项目来说,指定这个很简单,如下所示@SpringBootApplication(nameGen
2022-01-12 12:22:44
1154
1
原创 Spring源码学习一:spring核心底层原理解析
Bean的创建生命周期:UserInfoService.class-->无参数构造方法(推断构造方法)-->普通对象-->依赖注入(属性赋值)-->初始化前(调用@PostConstruct的方法)-->初始化(调用实现了InitializingBean的afterPropertiesSet()方法)-->初始化后(AOP)-->代理对象(如果有AOP)-->Bean1、@PostConstruct:在bean的方法中,如果方法上面有此注解,在bean
2021-10-16 15:23:17
177
原创 JVM参数调优:CMS垃圾收集器相关核心参数
CMS相关核心参数-XX:+UseConcMarkSweepGC【启用CMS垃圾回收器】-XX:ConcGCThreads【并发的GC线程数】-XX:+UseCMSCompactAtFullCollection【FullGC之后做压缩整理,减少碎片】-XX:CMSFullGCsBeforeCompaction【多少次FullGC之后压缩一次,默认0,代表每次FullGC之后都会压缩一次】-XX:CMSInitiatingOccupancyFraction【当老年代使用达该比例时会出发FullGC
2021-10-06 20:11:10
821
原创 Spring扩展点之BeanDefinitionRegistryPostProcessor:彻底搞懂原理以及使用场景【源码分析:揭开mybatis-spring的神秘面纱】
上一篇:Spring扩展点之BeanFactoryPostProcessor:彻底搞懂原理以及使用场景【源码分析】讲到
2020-08-31 18:02:43
1693
1
原创 Spring扩展点之BeanFactoryPostProcessor:彻底搞懂原理以及使用场景【源码分析】
spring框架流行了这么多年,地位至今不被动摇,除了spring全家桶的生态之外,它给开发者的提供的扩展也是值得一提的。那么今天就来聊聊Spring扩展点之BeanFactoryPostProcessor。这个扩展点是发生在bean实例化之前,BeanDefinition读取完之后。所以我们在这里可以获取到BeanDefinition,以改变他默认的实例化方式。由于文章内容是基于源码角度来讲的,考虑到有些朋友不需要看的如此的深入,所以在此贴出其简单的使用方式:加上@Component注解,使其加入到s
2020-08-30 16:47:33
10550
1
原创 springMVC之利用Servlet3.0的SPI机制实现零配置原理
在打开springMVC官方文档的开头介绍DispatcherServlet的时候,他首先介绍了一段配置:https://docs.spring.io/spring/docs/current/spring-framework-reference/web.htmlpublic class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(Se
2020-08-29 20:40:02
559
5
原创 定制阿里java规约,借用规则,自定义开发扫描提交svn的文件
前提:因公司发展需要,让其参照阿里规约插件开发一套能够扫描svn提交的java代码,然后生成报告发送给老总,然后对其没有按照规范来进行开发的予以处罚,至于啥处罚,自行脑补。思路:既然是参照阿里规约来进行定制,那么我们只需要找到阿里规约的核心代码,也就是扫描文件,然后打印出提示的那段代码。想到的第一步:下载阿里规约插件源码,部署到本地,进行断点找出核心代码。问题一:阿里规约插件下载下来,构建过程中出现多问题,没有构建成功,代码没有跑起来,失败!!!第二步,既然构建不成功,那么只能靠着读源码的经验去看代码
2020-08-21 23:16:33
370
原创 【springMVC源码解读系列】(一、项目启动:创建web应用容器,设置父容器)
spring源码解读地址:https://gitee.com/oushiyou/spring-framework-5.2.8.RELEASE这里首先附上一张整体流程图,以供解读的时候可以进行参考:我们在使用springMVC的时候,通常的做法是在web.xml中配置DispatcherServlet, 然后传入springMVC的配置文件位置。比如: <servlet> <servlet-name>springmvc</servlet-name>
2020-08-02 23:17:49
211
原创 【springboot源码解读系列】(五、springboot启动之解析META-INF/spring.factories的SpringFactoriesLoader详细解读)
上一讲【springboot源码解读系列】(四、springboot启动之SpringApplicationRunListeners:通知所有监听器,系统启动中…用于非常早的初始化)说到通过SpringFactoriesLoader加载META-INF/spring.factories获取我们的自定义监听器和启动器。那么这讲就来揭开SpringFactoriesLoader神秘的面纱:讲解都在注释里面:值得学习的是他的这种设计理念,通过指定规范,然后对其使用者提供扩展,springboot的启动器原理也
2020-07-27 17:41:33
1915
1
原创 【springboot源码解读系列】(四、springboot启动之SpringApplicationRunListeners:通知所有监听器,系统启动中...用于非常早的初始化)
SpringApplicationRunListeners系统运行监听器,监听者springboot项目运行各个生命周期,这节讲解starting,用于系统很早的初始化扩展,如果不想看细节,直接想了解SpringApplicationRunListeners各个周期的朋友,直接划到文章末尾,有对各个周期的详细注释,它的周期是围绕着项目启动来做的。在【springboot源码解读系列】(一、springboot创建SpringApplication实例,定制SpringApplication)中我们讲到了,
2020-07-26 23:07:03
742
原创 【springboot源码解读系列】(三、springboot启动使用的计时器StopWatch:短小精悍功能多,设计简单,容易阅读)
上一讲【springboot源码解读系列】(二、springboot创建SpringApplication实例后,正式启动之前的准备工作)说到,springboot在run一开始就使用到了一个计时器,并且开始计时,那么我们今天看一下他这个计时器的作用吧。他的计时方式和我们平时的System.currentTimeMillis()又有什么不同,他的功能强大在哪里?这个类是在org.springframework.util包下面的,是spring的一个工具包。我们经常使用spring,可以看一下他下面有哪些工
2020-07-24 22:41:22
732
原创 liunx中添加定时任务
crontab -e:添加定时任务表达式,将表达式和运行的命令输入,然后esc+:+qw保存30 1 * * * bash /home/backup/mysql_backup.sh >> /home/backup/log_backup.log比如上面的前面一段是cron表达式,后面是运行的命令,这里运行shell脚本,然后将日志输出到log_backup.log中crontab -l:查看定式任务30 1 * * * bash /home/backup/mysql_backup.s
2020-07-24 11:41:37
120
原创 【springboot源码解读系列】(二、springboot创建SpringApplication实例后,正式启动之前的准备工作)
上一节:【springboot源码解读系列】(一、springboot创建SpringApplication实例,定制SpringApplication)讲到了创建SpringApplication实例时,springboot做的一些事情:设置基础资源、推断应用程序的环境、通过SpringFactories加载我们自定义的初始化器和监听器、推断主入口类。创建完实例之后,调用了run方法开始运行。在实际开始工作之前需要做一些准备工作,就像我们上班一样,在开始写代码之前,需要做一些比如打开电脑,编辑器,抽支
2020-07-23 23:19:48
811
2
原创 【springboot源码解读系列】(一、springboot创建SpringApplication实例,定制SpringApplication)
源码地址:springboot2.x源码解读仓库,源码中包含有注释使用过springboot的都知道,我们创建一个主启动类,然后创建一个main函数,然后SpringApplication.run(Application.class); 我们的程序就启动起来了,至于怎么启动起来的,当前是什么样的环境,我们的tomcat容器在哪里启动的等,对于使用者,无需关心。但是对于好奇心比较人来说(比如我),就像一探究竟,他是通过什么样的方式来判断我们的应用程序是什么环境的,他又是如何加载我们的bean的,tomcat
2020-07-22 23:15:15
508
原创 【源码系列之springMVC】(三、请求上下文持有者:RequestContextHolder)
RequestContextHolder:请求上下文持有者,他是通过ThreadLocal放入当前请求线程中的,通过他的静态方法getRequestAttributes可以获取到RequestAttributes,如果我们是web项目,那么他的子类就是ServletRequestAttributes。我们可以根据processRequest方法中可以看出(以下只是代码片段):protected final void processRequest(HttpServletRequest request, Ht
2020-07-15 14:00:27
3022
原创 【源码系列之springMVC】(二、请求处理:processRequest)
客户端发送get或者post等请求,会调用Servelt项相对应的方法,比如get请求,就会执行Servlet的doGet方法。进过查看,DispatcherServelt类中并没有覆盖这几种方法,根据java多态的特性,如果子类没有此方法,那么就去直接父类找。然后在FrameworkServlet类中找到了处理这些请求的方法:FrameworkServlet的processRequest方法处理所有请求。...
2020-07-10 17:07:34
2178
2
原创 【源码系列之springMVC】(一、servlet入口:DispatcherServlet统筹全局之初始化web上下文)
今天来说说深入一下SpringMVC,在学习SpringMVC源码之前,必须得了解javaEE原生的Servlet的工作流程,以tomcat为例子:在web.xml中配置servlet,指定servlet-class以及servlet-mapping。然后请求过来根据mapping映射到servlet的类,执行其中的doGet、doPost等方法。具体这里就不细说了。一、从我们的web.xml入手2.1 从init参数设置bean属性:ServletConfigPropertyValues方法2.2 如果
2020-07-09 17:40:16
394
原创 【源码阅读技巧二】查看类中所有的方法和属性
我们在阅读源码的时候,遇到的类基本上都是上千行的,方法以及属性都是几十上百个,这样我们在类中一个一个去找的话,不但费事费力,而且很容易扰乱心智,使其没有心情继续读下去。今天使用IEDA来查看类中的所有方法和属性以及一些依赖引用等:方式一:选中我们想要查看的类 --> 按组合键 :Alt + 7(字母上面的那一排,小键盘中的数字貌似无效,不知道是不是我键盘的问题)方式二:打开我们想看的类 --> 按组合键 :Alt + 7(字母上面的那一排,小键盘中的数字貌似无效,不知道是不是我键盘的问题)
2020-07-09 15:42:52
816
原创 【设计模式】(二、设计模式之八大单例模式的实现方式)
所谓类的单例设计模式,就是采取一定的手段保证在整个软件系统中,某个类只能存在一个实例,并且该类只提供一个静态方法获取到该类的实例,不提供方法给其创建实例。一般对于一些比较重量级的,而且有一个实例就够用的,我们会将其设计成为单例模式,用于减轻系统的压力。单例模式的八种方式:饿汉式(静态常量)饿汉式(静态代码块)懒汉式(线程不安全)懒汉式(线程安全,同步方法)懒汉式(线程安全,同步代码块)双重检查静态内部类枚举饿汉式(静态常量)public class...
2020-07-07 22:40:22
111
原创 【设计模式】(一、设计模式之常用七大原则介绍)
都说学程序一定要懂得设计模式,因为他能够帮助我们写出高扩展性的代码,能够解决各种重复性出现的问题。设计模式出现的目的:我们开发者在编写软件的过程中,面临来自耦合性、内聚性以及可维护性、可扩展性、重用性、灵活性等多方面的挑战,设计模式的出现,就是为了让程序具有更好的代码重用性、可读性、可扩展性、可靠性、使程序具有高内聚,低耦合的特性。今天先来介绍一下设计模式的常用七大原则:单一职责原则接口隔离原则依赖倒置原则里氏替换原则开闭原则迪米特法则合成复用原则1、单一职责原则1、降低类的
2020-07-07 20:35:37
199
原创 【spring方法最全面,注释最全面的上下文工具类,拿走不谢,不来复制去使用太可惜了】SpringContextUtils
直接复制即可使用,注释很全。如果想看看具体细节的,提供更全面的方法的朋友们,请移步到:【springboot高级】(五:九大常用Aware实现之ApplicationContextAware (源码篇))package com.osy.util;import org.springframework.beans.BeansException;import org.springframework.beans.factory.NoSuchBeanDefinitionException;import
2020-07-05 22:13:19
441
原创 【springboot高级】(五:九大常用Aware实现之ApplicationContextAware (源码篇))
上篇:【springboot高级】(五:九大常用Aware实现、作用以及自定义实现类使用,例子:ApplicationContextAware (使用篇))我们将到了Aware的作用以及基本使用,并且例举了最常用的九大Aware实现,以表格的形式展示了其作用。那么这节我们将详细讲解ApplicationContextAware,他传递给我们的参数:上下文对象ApplicationContext我们应该如何使用,它给我提供了哪些api,那些api我们工作中比较常用。使用如下:package com.o
2020-07-05 22:12:24
1092
原创 【springboot高级】(五:九大常用Aware实现、作用以及自定义实现类使用,例子:ApplicationContextAware (使用篇))
ApplicationContextAware、EnvironmentAware、ApplicationEventPublisherAware、BeanNameAware、BeanClassLoaderAware、BeanFactoryAware、EmbeddedValueResolverAware、ResourceLoaderAware、MessageSourceAware。首先来介绍一下Aware:指示bean有资格被特定框架对象的Spring容器,通过回调样式的方法。实际的方法签名由各个子接口
2020-07-05 14:08:40
1919
原创 【springboot高级】(四:自定义初始化器,实现ApplicationContextInitializer「ConfigurableApplicationContext」设置必须配置的属性)
在我们自定义启动器之自动装配的时候,有些属性需要进行配置,但是如果不配置的话,可能会引起系统异常。那么这个时候我们就需要设置一些属性必须配置,在系统初始化的时候就应该进行检查,而不是等系统运行起来,运行到需要那个配置的时候在检查就来不及了。那么今天我们通过自定义系统初始化器来进行实现:详细的自定义系统初始化器请看【springboot高级】(一:自定义容器初始化器的三种方式,实现ApplicationContextInitializer接口。(使用篇))同时如果想看springboot实现的源码的,
2020-07-03 17:48:19
813
原创 【springboot高级】(三:自定义启动器之自动装配:EnableAutoConfiguration ,封装minio,只是用minio做个简单的例子,具体的还需要根据自己的需求更改{IDEA})
自定义启动器实现minio自动装配
2020-07-03 11:46:25
514
原创 springboot整合mybatis配置异常:Property ‘configuration‘and‘configLocation‘cannotspecifiedwithtogether源码角度分析
Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception;Caused by: java.lang.IllegalStateException: Property 'configuration' and 'configLocation' can not specified with together出现这个异常的原因是:
2020-07-02 18:07:48
4517
2
原创 【springboot高级】(二:自定义系统监听器,实现ApplicationListener接口。(使用篇))
springboot在系统启动的时候,提供了很多的监听,有时候我们需要根据一些业务,在启动的时候监听springboot启动的某个节点,然后做相应的事情,那么这节就来讲一下如何实现自定义监听器,在springboot发送事件的时候,我们能够监听到。(注意:自定义监听器和自定义初始化器原理一波一样,方式也是一模一样,如果需要看自定义初始化器的,可以查看【springboot高级】(一:自定义容器初始化器的三种方式,实现ApplicationContextInitializer接口。(使用篇)))首先我们需
2020-07-02 09:26:57
1124
原创 【源码阅读技巧一】查看类关系图,接口实现关系图(idea版本)Diagrams关系图
我们在阅读源码的时候,往往需要理清楚各个类,各个接口之间的关系,然后再去理解他的设计思路,有个大概理解,然后去阅读源码,就容易很多,那么今天就来讲一下如何使用idea来查看关系图:一、查看类的父类,以及实现的接口1、打开想要查看的类,通过idea的定位找到类所在位置2、点击鼠标右键,二、查看接口的关系图,以及实现类前面几个步骤和查看类的关系图一样直接到这一步然后我们选中它,这个例子就只是一个单独接口,如果有多个的话,就选中想要查看的接口:然后右击选择show implementations
2020-07-01 22:03:16
1397
原创 【springboot高级】(一:自定义容器初始化器的三种方式,实现ApplicationContextInitializer接口之在配置文件中配置。(源码篇))
在【springboot高级】(一:自定义容器初始化器的三种方式,实现ApplicationContextInitializer接口。(使用篇))讲到了说通过配置文件中进行配置的优先级比较高,而且我们打的@Order注解对其没有效果。那么这节就通过源码的方式来揭开他的真面目。关键字:DelegatingApplicationContextInitializer、order、context.initializer.classes、spring.factories在讲之前,我们先熟悉一下Delegating
2020-07-01 13:37:58
423
原创 【springboot高级】(一:自定义容器初始化器的三种方式,实现ApplicationContextInitializer接口之向SpringApplication对象中添加初始化器。(源码篇))
上一篇【springboot高级】(一:自定义容器初始化器的三种方式,实现ApplicationContextInitializer接口之SpringFactoriesLoade加载。(源码篇))我们讲到了通过SpringFactoriesLoade加载的方式配置我们自定义初始化器的源码解析。我们得知Springboot是在创建SpringApplication实例的时候通过pringFactoriesLoade加载所有的spring.factories文件,然后将其实例化存储在initializers属
2020-07-01 12:48:25
248
原创 【springboot高级】(一:自定义容器初始化器的三种方式,实现ApplicationContextInitializer接口之SpringFactoriesLoade加载。(源码篇))
上一篇【springboot高级】(一:自定义容器初始化器的三种方式,实现ApplicationContextInitializer接口。(使用篇))我们讲到了,注册自定义应用初始化器的三种方式:让SpringFactoriesLoader进行加载,配置spring.factories向SpringApplication对象中添加Initializers在配置文件中配置,这种方式优先级最高,跟@Order注解无关那么我们这篇从源码的角度来看一下他们是如何注册进去并且执行的。一、SpringFa
2020-07-01 11:15:25
5264
mysql-connector-java-8.0.20-1.el8.noarch.rpm
2020-06-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人