自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Evan's Blog ٩(๑❛ᴗ❛๑)۶

我不会Java,但也不是一点都不会

  • 博客(181)
  • 收藏
  • 关注

原创 分布式锁的介绍和实现(附源码)

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?一、为什么要使用分布式锁我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的锁进行处理。但是,普通的锁只能在单机的情况下使用。如果业务发展,需要做集群,一个应用需要部署到几台机器人然后做负载均衡,如下图所示:...

2022-03-09 20:27:16 1200

原创 BeanFactory和FactoryBean区别

一、BeanFactory1、简单介绍这个其实是所有Spring Bean的容器根接口,给Spring 的容器定义一套规范,给IOC容器提供了一套完整的规范,比如我们常用到的getBean方法等。进入到这个类,我们可以看到如下注释,意思是:访问Spring bean容器的根接口。2、定义方法getBean(String name): Spring容器中获取对应Bean对象的方法,如存在,则返回该对象。 containsBean(String name):Spring容器中是否存在该

2022-02-07 17:41:43 1582 1

原创 @TransactionalEventListener的使用和实现原理

一、问题描述平时我们在完成某些数据的入库后,发布了一个事件,此时使用的是@EventListener,然后在这个事件中,又去对刚才入库的数据进行查询,从而完成后续的操作。例如(数据入库=>对入库数据进行查询审核),这时候会发现,查询不到刚才入库的数据,这是因为事务还没提交完成,在同一个事务当中,查询不到才存入的数据,那么就引出了下面的解决方式。为了解决上述问题,Spring为我们提供了两...

2020-04-25 14:40:05 24179 14

原创 Spring之@DependsOn的实现原理

为什么要控制Bean的加载顺序?首先spring容器对一般的bean的初始化顺序是不确定的**(个别Spring自身初始化用的bean和配置类的bean会优先初始化)。**,但是我们在某些场景下(具体场景如下面举例),我们又需要控制顺序。这时候,就用到了@DenpendsOn。一、@DependsOn的使用使用场景:1、beanA 间接依赖 beanB并不是直接通过 构造方法或@Aut...

2019-12-24 21:35:49 1725

原创 Spring事件发布与监听

最近算是把spring整体的又过了一遍,发现很多东西虽然用的多,但是有些思想理解的不够透彻,在此记录下,顺便感叹下,spring源码看了大部分,这才没过多久又忘了 TnT 。一、事件监听相关概念介绍1、流程分析事件:做了什么事。例如,我在写博客,写博客就是一个事件。监听器:监听发生事件的组件。例如,我们日常生活中的火灾报警器,监听有没有发生火灾事件。在一个完整的事件体...

2019-12-10 16:40:49 1498 1

原创 SpringBoot自动配置原理

最近温习开始温习下SpringBoot的源码,个别的一些原理和用法在此记录一下。一、原理介绍:基于SpringBoot代码版本:2.1.5.RELEASE,2.0.x和2.2.x略有不同。我们都知道使用SpringBoot时候,都会编写一个启动类,启动类上面加@SpringBootApplication注解。SpringBoot之所以能完成自动配置的关键就是在这个注解之中。...

2019-12-02 12:16:41 10619 4

原创 SpringMVC零xml配置原理

前言:在我们使用springmvc时,每次都要去配置web.xml,spring-mvc.xml,甚至和spring整合时候,还要配置spring.xml。用起来比较麻烦,用过springboot的朋友应该知道,springboot中使用springmvc时候就不会去指定xml。那这样的操作是怎么实现的呢,下面我们就来探究下springmvc零配置xml原理。一、搭建测试项目由于代...

2019-11-20 23:44:43 813

原创 手写模拟SpringMVC

前言:springmvc想必大家都有用过,但是你有去真正的了解过springmvc究竟是怎么进行工作的吗?为什么加上@controller @RequestMapping等注解,就会映射到指定类的方法上呢?下面我们就来探究一下,手写模仿一个springmvc。注:代码演示主要侧重原理的模拟,有很多细节存在不足,请勿较真。 如果有什么改进意见,欢迎大家提出...

2019-11-15 17:59:02 361

原创 Spring应用之AOP的使用和总结

前面一篇文章分析了Spring AOP的原理,下面这篇文章对Spring AOP做一个简单的介绍和总结。一、Spring AOP的常见面试题目1.AOP是什么与OOP对比,面向切面,传统的OOP开发中的代码逻辑是自上而下的,而这些过程会产生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不大,这些横切性问题不会影响到主逻辑实现的,但是会散落到代码的各个部分,难以维护。AOP...

2019-11-04 00:22:36 363

原创 spring源码分析之Aop

今天读spring源码,读到aop相关内容,在此记录一下,以便以后复习和查阅。一、spring如何实现Aop这里简单的说下原理,spring实例化bean要经历一套完整的生命周期,在这个过程中会对要实例化的bean进行各种各样的处理,例如先new对象、进行属性注入、处理循环依赖、处理生命周期回调、实现Aop等等。这些操作实际都是通过spring的后置处理器,也就是通过BeanPostP...

2019-11-01 17:51:58 2136

原创 Spring注解之@Import用法

最近在看spring5.1以及mybatis-spring源码的时候,发现@MapperScan以及很多springboot的@EnableXXX注解,都用到了这个@Import注解。所以打算仔细研究下该注解的作用。顺便把类似的@ImportRescource也在这里总结一下。一、@Import简介简介:在Spring3.0之前,我们的bean可以通过xml配置文件和扫描特定包下...

2019-10-29 19:52:46 1613

原创 Spring源码分析之扩展点BeanDefinitionRegistryPostProcessor

一、BeanDefinitionRegistryPostProcessor接口简介:该接口继承了BeanFactoryPostProcessor接口,且新增postProcessBeanDefinitionRegistry方法。方法参数是BeanDefinitionRegistry对象,BeanDefinitionRegistry对象是bean定义的保存中心(实际底层就是BeanDefini...

2019-10-24 03:18:05 855

原创 详解Spring中getBean()方法

我们日常会经常使用getBean()方法从spring容器中获取我们需要的bean。那么,getBean()方法是怎么一步步完成从spring容器中获取bean的呢?下面我们就通过源码分析一下。一、主要代码分析 基于:spring5.1入口:AbstractBeanFactory类的doGetBean(): public Object getBean(String n...

2019-10-17 13:40:26 10161

原创 详解Spring中bean生命周期回调方法

对于spring的bean来讲,我们默认可以指定两个生命周期回调方法。一个是在ApplicationContext将bean初始化完全完成后,包括注入对应的依赖(例如属性注入)后的回调方法;另一个是在ApplicationContext准备销毁之前的回调方法。要实现这种回调主要有三种方式:实现特定的接口。 在XML配置文件中指定回调方法。 使用JSR-250标准的注解。关于生命周期...

2019-10-13 13:47:05 1204

原创 关于registerSingleton()方法的缺点

之前在《如何把对象放入spring容器》这篇文章中,提到了registerSingleton()方法。说这个方法有些鸡肋。利用这篇文章解释一下为什么说这个方法它比较鸡肋呢。注:读这篇文章前需要你对spring的依赖关系有一定的了解,否则可能看起来吃力一些。如果实在看不懂,就记住用法就行了,不用纠结。一、关于存在的问题/** * 按照这种写法的话, * 因为当前要托管...

2019-10-11 20:39:44 5813 8

原创 SpringBoot 可以同时处理多少请求

首先,在Spring Boot应用中,我们可以使用 Tomcat、Jetty、Undertow 等嵌入式 Web 服务器作为应用程序的运行容器。这些服务器都支持并发请求处理的能力。另外,Spring Boot 还提供了一些配置参数,可以对 Web 服务器进行调优,以提高其并发处理能力。而我们大家都知道,Spring Boot应用默认使用的Web服务器(内嵌容器)为Tomcat,了解了以上内容,我们就知道,这个问题的本质就是一个Spring Boot应用,内嵌的Tomcat能够处理多少请求。

2023-10-03 23:36:57 2482 2

原创 Spring的编程式事务TransactionTemplate

本文介绍了Spring框架中TransactionTemplate的用法。TransactionTemplate提供了一种在代码中进行编程式事务管理的方式,使开发人员能够在方法级别定义事务的开始和结束点。通过配置事务管理器并使用TransactionTemplate,我们可以方便地执行事务操作,并根据需要设置传播行为和隔离级别。希望本文能够帮助你更好地理解和应用Spring的事务管理功能。

2023-07-18 22:45:24 7624 3

原创 Docker Compose Demo,一个能帮助你彻底解决使用docker搭建各种服务难题的代码库

您是否在工作中用docker1.每次都要重复查找搭建服务的docker命令,浪费时间。2.找到的docker命令各式各样,毫无规范。3.命令可以使用,但是需要设置的参数残缺不全。4.对要搭建的服务需要设置的相关参数一知半解,无法配置。5.不清楚使用的命令是否经过验证,无法保证安全性和可靠性。👉是一个旨在帮助开发者用快速、便捷、可靠地部署相关docker服务的代码库,目前总共包含14个demo。服务功能简介官方网站jenkins持续集成工具gitlab代码仓库管理系统redis。

2023-04-25 15:48:33 1863 1

原创 Explain详解与索引优化最佳实践

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。

2023-03-31 11:39:50 427

原创 CompletableFuture的使用

现在大部分的CPU都是多核,我们都知道想要提升我们应用程序的运行效率,就必须得充分利用多核CPU的计算能力;Java为我们提供了大量多线程API,使用它们可以让我们的代码避免同步阻塞,从而达到提升运行效率的目的,CompletableFuture就是其中一个非常强大且重要API,下面我们就来介绍一下CompletableFuture的概念和使用。

2023-03-20 15:42:05 8755

原创 @AliasFor的使用方法

注意,我们需要在MyCombinedAnnotation中加上@MyAnnotation1、@MyAnnotation2、@MyAnnotation3三个注解,表示这个新注解中包含了这三个注解的所有属性,可以通过@MyCombinedAnnotation来代替这三个注解的使用。当然,你也可以理解为将一个注解上的属性值传递给另一个注解,我个人更习惯采用这种理解,因为后续可以通过一个注解组合多个注解进行使用,通过一个注解将值传递给多个注解,而这与java的继承的概念并不相同。

2023-03-07 12:48:13 2625 2

原创 flyway的快速入门教程

一、简单介绍  Flyway是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。  在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表也会在迭代周期不断迭代。在Java应用程序中使用Flyway,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的。flyway官方文档https://flywaydb.org/documentation/二、为什么要使用flyway.

2022-04-12 21:35:45 38821 14

原创 使用docker安装mysql8

一、安装docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --lower_case_table_names=1 mysql:8.0.25参数解释-v:挂载宿主机目录和 docker容器中的目录,前面是宿主机目录,后面是容器内部目录。-d:后台运行容器。-p:映射容器端口号和宿主机端口号。-e:环境参数,MYSQL_ROOT_PASSWORD设置root用户的密码。–lower_case_table_n

2022-03-28 20:07:55 9731

原创 LVS的负载均衡算法

Lvs负载均衡算法简介

2021-12-25 11:45:45 1508

原创 keepalived 配置文件详解

关于keepalived配置文件内容的详细介绍。

2021-12-25 11:34:13 5295

原创 jenkins github账号密码验证方式失效 解决方式

一、问题描述在2021年8月13日git移除了通过用户名和密码在外部访问源码仓库的方式。我是在jenkins自动构建时候发现的,所以这里我说一下如何在jenkins中解决这个问题。1、错误信息文字stderr: remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.remote: Please see ht

2021-09-26 09:27:39 3178 1

原创 Morphia的使用方法

目录一、什么是Morphia二、创建Morphia实例和映射关系1、创建实例2、映射选项3、映射类三、数据库操作1、保存数据2、查询3、更新4、删除一、什么是MorphiaMorphia是一个开放源代码的对象关系映射框架,它对MongoDB数据库java版驱动进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵MongoDB数据库,也让Java程序员可以从复杂数据库设计中脱离出来,从而将更多的精力投入到业务逻辑中去。由此可见

2021-09-24 10:08:57 1085

原创 使用nacos作为配置中心获取不到配置内容

一、问题描述最近要搞分布式配置中心,然后技术选型方面考虑了spring-cloud-config和阿里开源的nacos。但是在项目代码和nacos完全启动后,发现并没有访问到nacos中的配置项。二、解决方案1.配置文件首先要保证项目中的bootstrap.yml配置文件存在,且里面的配置正确。注意:这里我使用的为.yml格式配置文件。且指定 spring.profiles.active=dev。如果你也使用的.yml格式,一定要在bootstrap.yml中指明 file-extension

2020-06-18 20:16:34 23987 2

原创 nth-child的使用方法

一、需求描述在开发过程中,会碰到一些选择器的需求:例如使列表中的第一项或者最后一项显示不同的样式 、列表中的奇数或者偶数项显示不同的背景色 . . . 等等。我们可以通过 CSS 来实现这样的效果,CSS 给我们提供了几个样式参数:first-child、last-child、nth-child(n)。二、使用方法的代码示例1.常见使用方法first-child first-child:选择列表中的第一个标签。举例:第一行字体显示为红色,代码如下:li:first-child{ c

2020-06-09 21:09:06 85864 4

原创 软件设计七大原则:(七)合成复用原则

一、合成复用原则简介定义:尽量使用对象组合/聚合,而不是继承关系达到软件复用的目的。聚合has-A和组合contains-A。优点:可以使系统更加灵活,降低类与类之间的耦合度,一个雷的变化对其他类造成的影响相对较少。二、合成(组合)/ 聚合复用原则何时使用合成/聚合、继承?聚合has-A、组合contains-A、继承 is-A二、代码实现注:以下均为用作示例的伪代码1.当有多个数据库连接类时,如何扩展?public class DBConnection { public

2020-06-08 22:31:03 1359

原创 软件设计七大原则:(六)里氏替换原则

一、里式替换原则简介定义:如果对每一个类型为T1的对象o1 ,都有类型为T2的对象o2 ,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。t:类型(type)o:对象(object)p:程序(program)定义扩展:一个软件实体如果适用一个父类的话,那一定适用于其子类,所有引用父类的地方必须能透明地使用其子类的对象,子类对象能够替换父类对象,而程序逻辑不能变。引申意义:子类可以扩展父类的功能,但不能改变父类原有的

2020-06-08 20:54:29 678

原创 软件设计七大原则:(五)迪米特原则

一、迪米特原则简介定义:一个对象应该对其他对象保持最少的了解。又叫最少知道原则。尽量降低类与类之间的耦合优点:降低类之前的耦合强调只和朋友交流,不和陌生人说话什么是朋友类?朋友类指的是出现在成员变量、方法的输入、输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类。二、代码实现1.违背迪米特原则的反例public class Course {}public class Boss { public void commandCheckNumber(TeamLead

2020-06-07 18:34:13 421

原创 软件设计七大原则:(四)接口隔离原则

一、接口隔离原则简介用多个专门的接口,而不再使用单一的总接口,客户端不应该依赖它 不需要的接口。一个类对一个类的依赖应该建立在最小的接口上。建立单一接口,不要建立庞大臃肿的接口。尽量细化接口,接口中的方法尽量少。注意:注意适度原则,一定要适度,过大的话会增加耦合性,而过小的话会增加复杂性和开发成本。优点:符合我们常说的高内聚低耦合的设计思想,从而使得类具有很好的可读性、可扩展性和可维护性。二、代码实现...

2020-06-07 13:16:58 1740

原创 软件设计七大原则:(三)单一职责原则

一、单一职责原则简介定义:不要存在多于一个导致类变更的原因一个/类/接口/方法只负责一项职责优点:降低类的复杂度、提高类的可读性,提高系统可维护性、降低变更引起的风险。二、代码实现...

2020-06-07 02:00:50 356

原创 软件设计七大原则:(二)依赖倒置原则

一、依赖倒置原则简介定义:高层模块不应该依赖底层模块,二者都应该依赖其抽象抽象不应该依赖细节,细节应该依赖抽象针对接口编程,不要针对实现编程二、代码实现public class Evan { private Course course; public void setCourse(Course course) { this.course = course; } public void studyCourse(){ cours

2020-06-06 14:18:55 511

原创 软件设计七大原则:(一)开闭原则

一、开闭原则简单介绍定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。表现:用抽象构建框架,用实现扩展细节。优点:提高软件系统的可复用性及可维护性。二、代码实现public interface Course { Integer getId(); String getName(); Double getPrice();}public class JavaCourse implements Course { private I

2020-06-05 23:40:09 869

原创 关于Java代码中的日志处理规范

一、使用slf4j使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。实现方式统一使用: Logback框架。二、打日志的正确方式1.什么时候应该打日志当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。当你碰到if…else 或者 switch这样的分支时,要在分支的首行打印日志,用来确定进入了哪个分支。经常以功能为核心进行开发,你应该在提交代码前,可以确定通过日志可以看到整个流程。2.基本格式必须使

2020-06-03 22:32:23 815

原创 Spring Boot 定制与优化内置的Tomcat容器

一、需求描述为了扩展spring boot内置的tomcat容器的性能,例如最大可连接数、最大工作线程数等。可通过配置文件进行部分配置:server.tomcat.accept-count :等待队列长度,默认100server.tomcat.max-connections :最大可被连接数,默认10000server.tomcat.max-threads:最大工作线程数,默认200server.tomcat.min-spare-threads:最小工作线程数,默认10但是一些配置是无法通过

2020-05-24 13:39:24 896

原创 SpringBoot中获取ApplicationContext的方法

一、需求描述在使用SpringBoot框架开发的过程中,我们有时候需要通过ApplicationContext获取一些bean。这时候,就需要我们先获取ApplicationContext。那么什么是ApplicationContext呢?简单来说就是Spring中的容器,可以用来获取容器中的各种bean组件,注册监听事件,加载资源文件等功能。常见的有ClassPathApplicationContext、AnnotationConfigApplicationContext他们都继承了Applic

2020-05-23 22:16:27 13087

原创 Jenkins的环境变量使用说明

一、使用方法下面的环境变量可以在配置Jenkins Job的时候用得到,可以用在Execute shell、Execute Windows batch command、文本框 上加上编辑好的的shell脚本。1.Windows:%BUILD_NUMBER%,即 %变量名%的形式。2.Linux:${BUILD_NUMBER} ,也可以直接使用$BUILD_NUMBER。倘若是自己定义的参数化(Parameter)在调用时可以直接 用 $参数名,比如调用这个时直接 $endPoint3.在Maven

2020-05-09 23:33:33 6364

空空如也

空空如也

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

TA关注的人

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