自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring中申明式事务(@Transactional)实现的原理解析

@Transactional申明式事务其实也是AOP增强的一种,所以实现的原理也是跟AOP一样,只是具体的切面以及切入点的不同。

2024-04-19 16:42:10 451

原创 Jackson配置处理LocalDateTime、LocalDate等java8时间类型失效的问题解决

本文主要是上个章节留下来的问题,关于builder.build()导致model已经被加载过了的问题似乎我没有说清楚,主要是也不想花时间深究了,有空再去看看初始化的过程。

2024-04-11 18:05:21 567

原创 使用Jackson进行序列化和反序列化

Java生态系统中有很多处理JSON数据的库,比如Gsonfastjson等。关于Jackson相对于其他的序列化类库的区别和优势,网上有很多非常详细的文章。只提一点就是Jackson是SpringSpringBoot以及一些远程调用框架例如Feign中默认使用的序列化类库。所以在日常的web项目开发中可以直接使用Jackson,而不用额外引入其它的序列化类库。本篇文章主要针对如何在日常项目开发中使用Jackson,以及在使用Jackson的时候需要注意的问题。Jackson配置类@Primary。

2024-04-01 11:27:12 686

原创 SpringBoot IOC之@Autowried原理

SpringBoot的两大特性,控制反转(IOC)和AOP,上一篇文章已经分析过了IOC的原理。下面就来分析分析IOC的原理。控制反转,顾名思义就是将注入类的控制权限交由Spring容器管理。被注入类并不知道将要注入的具体类是哪个,具体注入哪个类将由Spring控制。这样就可以通过注入接口类型类的方式去注入类,利用类的多态特性,可以根据业务的不同去指定不同的实现类去执行逻辑。

2024-02-29 16:29:09 769

原创 SpringBoot的AOP原理

Spring的两大特性为IOC和AOP,所以想要彻底的去了解和熟悉Spring或者SpringBoot,那么IOC和AOP是首当其冲需要去了解和熟悉他们原理的,不然都不好意思说自己了解SpringBoot,更别说能够用好SpringBoot了。SpringBoot是如何去实现AOP的呢?通过几个简单的注解就可以实现方法的增强,其中的原理又是什么呢,这篇文章就来详细的分析一下SpringBoot实现AOP的原理。

2024-02-21 10:38:11 956

原创 @Configuration 注解的原理

在使用SpringBoot的时候,如果想定义一个配置类就可以使用@Configuration注解,并且在@Configuration注解的类中可以通过@Bean注解来完成Bean注入到Spring容器中。那么SpringBoot是什么时候读取@Configuration注解并将注解修饰的类中的Bean加载到容器中的呢。本篇文章通过源码分析了@Configuretion注解的实现原理。

2024-02-05 18:36:09 631 1

原创 一文搞懂枚举类型

枚举类型其实就是一个特殊的类类型,本质上是一种继承java.lang.Enum类,是引用数据类型。下面定义一个枚举类型枚举类只有一个私有类型的构造方法,所以不能够创建对象。通过javac对该枚举类进行编译,然后通过javap对该类进行反编译,看看结果是什么可以看到,生成一个继承java.lang.Enum的类,枚举类里面的元素都会生成定义的枚举类类型的对象,生成的类为final修饰,所以不能进行继承,保证了枚举类型的安全。所有枚举内的每一个元素都是一个对象。

2023-07-14 14:35:58 1817

原创 一文搞懂java中的泛型

定义一个泛型类的方法class 类名 {private 泛型标识 成员变量;泛型标识可以是T:代表一般的任何类型E:代表Element 元素或者Exception异常的意思K:代表key的意思V:代表value的意思S:代表subtype的意思也可以是任意自己定义的字母符号。

2023-07-06 10:34:54 155

原创 SpringBoot中使用RedisTemplate

下面是我在使用RedisTemplate在操作Redis的过程中遇到的一些问题以及解决方案。一、RedisTemplate无法序列化javabeanRedisTemplate的默认序列化的类为JdkSerializationRedisSerializer,如果使用默认的序列化类,则在取数据的时候则会报错自定义RedisTemplate的序列化方式@Bean// 使用 GenericFastJsonRedisSerializer 替换默认序列化// 设置key和value的序列化规则。

2023-05-19 18:24:02 515

原创 通过ClientHttpRequestInterceptor实现简单的服务负载均衡调用

最近在进行功能开发的时候遇到了一个问题,提供服务的服务器为了避免单点故障所以部署了两台服务器,由于当前的服务架构比较简单,并没有引入分布式服务架构,所以如何对这两台服务器进行负载均衡调用以及重试和熔断就需要自己来实现。本来可以引入ribbon和,但是发现引入之后需要引入springcloud框架,所以就放弃了。本着学习ribbon的原理的态度,所以准备手写一个负载均衡,满足当前的需求。使用过Ribbon的都知道,只要在Resttemplate上面加上注解就可以实现调用的负载均衡。

2023-05-05 10:02:51 375

原创 创建对象的流程以及对象中各个组件的加载时机和加载顺序

本文介绍了类的加载过程,以及类初始化和实例化的流程以及流程的执行顺序。大概可以总结为:类进行实例化之前会先进行加载,加载过程会产生Class对象并且进行Class对象的初始化给静态变量赋值并且调用静态代码块,如果存在父类则会先调用父类的静态代码块。实例化对象的时候会先调用父类的构造方法再调用字类的构造方法。Class类只会初始化一次,所以初始化Class对象的时候所执行的操作只会执行一次,所以无论创建多少个对象,他的静态代码块只会执行一次,并静态变量也是一样的。类的加载机制new一个对象的过程。

2023-03-09 23:15:30 380

原创 Spring Cloud Gateway路由

路由(route): ⽹关最基础的部分,也是⽹关⽐较基础的⼯作单元。路由由⼀个ID、⼀个⽬标URL(最终路由到的地址)、⼀系列的断⾔(匹配条件判断)和Filter过滤器(精细化控制)组成。如果断⾔为true,则匹配该路由断言(predicates): 参考了Java8中的断⾔,开发⼈员可以匹配Http请求中的所有内容(包括请求头、请求参数等)(类似于nginx中的location匹配⼀样),如果断⾔与请求相匹配则路由。过滤器(filter):⼀个标准的。

2023-03-05 11:32:54 1009

原创 线程池--从入门到精通

在日常写代码的时候为了避免线程过度切换以及避免创建过多的线程导致OOM,所以线程资源必须通过线程池来提供。要使用线程池则对于线程池的理解至关重要,本文主要介绍线程池的原理、线程池中的一些参数以及参数所产生的作用。后面会介绍线程池的高级用法,线程池监控、动态线程池等。一、常见的几种线程池newCachedThreadPool:可缓存的线程池,如果线程池中的线程超过处理需要,可以灵活的回收空闲线程。

2023-02-28 22:36:10 83

原创 分布式系统的一致性问题解决方案

随着互联网的发展,对于后端服务的架构也需要随之进行改变。从传统的单体架构到服务化架构再到微服务架构,架构在不断的演变,在解决问题的同同时也带来了新的问题。在微服务架构下,服务之间的调用通过网络带宽进行数据的交流,在这个背景下由于网络的不稳定加上微服务间是自行管理自己的数据,所以会出现不一致的问题。本文针对分布式系统下微服务间的不一致性进行分析,并提供解决方案。该内容是阅读《分布式服务架构--原理、设计与实战》的读后总结笔记。

2023-02-18 22:19:57 1301

原创 SpringBoot中的扩展点接口

SpringBoot在启动以及bean的构造生命周期中会调用一些SpringBoot的的扩展接口类,了解了这些扩展点之后我们可以在SpringBoot启动的时候或者Bean加载的时候进行一些定制化的设置,加载一些资源。一、SpringBoot有哪些展点,以及这些扩展点的执行顺序上面是SpringBoot一些扩展点的执行顺序,下面可以通过实现这些接口来看看是否真是如此。

2023-02-08 15:34:15 469 1

原创 MYSQL事务的隔离性之MVCC

在RR级别下面实现的原理是跟RC是一样的,只不过RR要实现在同一个事务中多次读的结果都是一致的,所以RR级别下面在事务开始的时候获取一次read view,后面不管有其它的多少个事务的变化在当前事务中只有一开始的read view,这就是RR与RC区别就在于read view是否是实时更新。因为每次有一个新的事务发生之后,都会将当前活跃的事务ID放入到read view中,而在RC隔离级别下每次获取的都是最新生成的read view,所以读到的都是最新的已经提交的数据,即为读已提交。

2022-12-19 12:45:27 247

原创 探究MYSQL的连接查询

msql连接查询

2022-12-13 15:35:51 510

原创 深入探究Spring MVC如何处理请求报文和响应报文

创建一个Controller然后定义一个方法,方法上面添加@RequestMapping定义url,然后在方法参数中添加@RequestBody注解,在方法上添加@ResponseBody注解,这样在通过url调用这个接口的时候就会自动将参数转换成对象,并且将响应报文也变成对象。而且在调用接口的时候传的String类型的对象,处理请求的handler方法中参数类型却是Integer,这些都是如何实现的呢。其实这些都是通过Spring的参数装换器实现的,接下来我们就通过源码的形式看一下这种参数装换的细节。

2022-12-02 11:29:38 518

原创 Spring MVC的工作流程探究

Spring MVC

2022-11-27 18:28:26 113

原创 使用UnitTest编写接口自动化脚本

自动化接口测试

2022-11-22 15:20:54 694

原创 异步编程(CompletableFuture、CompleteService)

并发

2022-10-28 18:20:09 1474

原创 Spring依赖注入之构造方法注入、set方法注入以及基于字段的方式注入比较

spring依赖注入方式比较

2022-10-08 18:02:29 1050 4

原创 Redis的数据结构

redis的数据结构

2022-07-01 18:18:17 10509 1

原创 NIO-零拷贝

nio

2022-06-24 17:13:58 734

原创 代码生成器-mybatis-plus-generator

代码生成器

2022-06-18 19:16:47 14068 4

原创 锁-ReentrantLock

ReentrantLock

2022-06-17 18:11:34 622

原创 并发和JUC

一、并发1、线程的状态2、创建线程的方法3、synchronized4、wait和notify5、线程中断(interrupt)6、并发问题7、JMM内存模型8、指令重排序和内存可见性二、JUC1、并发容器初始化一个数组用来容纳元素,并且创建一个锁,当调用只有一个容量大小参数的构造方法的时候默认创建的是一个非公平锁,即等待添加元素或者获取元素而阻塞的线程是非公平竞争的。这里创建了两个Condition,将非空状态和非满状态分开这样可以在非空的时候只唤醒等待获取元素的线程,而不会唤醒等待插入的线程,这就比wa

2022-06-15 16:27:50 96

原创 SpringBoot中将Bean注入到Spring容器的一些方法

1、传统的方法注解注入 XML注入 继承FactoryBeanSpring中不仅仅有这些传统的方法,还有一些框架内部经常使用的一些注入的方法2、ImportBeanDefinitionRegistrar动态注入Spring也是通过ImportBeanDefinitionRegistrar实现了@Component、@Service等注解的动态注入。还有一些框架比如Mybatis中的Mapper接口,以及SpringCloud的FeignClient接口的注入都是通过该接口实现的自定义注册逻

2022-05-25 17:42:15 1880

原创 ConcurrentHashMap源码分析

我们从ConcurrentHashMap的带参的构造方法为入口进行源码的分析,首先看到它的构造方法。cap为初始容量,由上可知,当初始容量大于等于最大容量的一半时则map的初始容量为最大的容量,否则通过tableSizeFor这个方法进行初始容量的计算,我们可以进入方法看一下初始容量是怎么计算的。意思就是获取比传入的容量大的并且是2的次幂的数。容量设置为2的次幂也是为了日后做扩容的时候方便。 回到构造方法,最后一行代码是将sizeCtl参数赋值为cap,sizeCtl这个参数是值扩容的阈值,

2022-05-15 18:30:39 739

原创 Dubbo

一、dubbo的处理流程Provider:暴露服务的服务提供方 Consumer:调用远程服务的服务消费方 Registry:服务注册与发现的注册中心 Monitor:统计服务的调用次数和调用时间的监控中心 Container:服务运行容器 负责启动 加载 运行服务提供者二、服务注册注册中心是Dubbo的重要组成部分,主要用于服务的注册与发现,我们可以选择Redis、Nacos、Zookeeper作为Dubbo的注册中心,Dubbo推荐用户使用Zookeeper作为注册中心。单选择z

2022-04-16 18:51:50 2741

原创 Hystrix熔断器-源码分析

Hystrix熔断器的使用,在启动类上添加注解@EnableCircuitBreaker,然后在具体的请求上添加@HystrixCommand,则对该接口的调用会使用熔断的规则。我们以@EnableCircuitBreaker注解为入口,分析熔断器的源码。注解中引入了一个类EnableCircuitBreakerImportSelector,进入该类查看具体情况。该类继承了SpringFactoryImportSelector,这个是用来加载spring.factory里面的配置类的。进入Spr

2022-03-13 10:55:11 855

原创 Ribbon-源码分析

ribbon负载均衡,在RestTemplate上面添加注解@LoadBalanced就可以实现负载均衡。接下来分析Ribbon是怎么实现负载均衡的。老规矩,先查看相关的启动依赖下面的spring.factorise文件中配置的自动装配的类。进入spring-cloud-netflix-ribbon#spring.factorise,该文件中自动专配了RibbonAutoConfiguration类。进入该类看一下详情信息如此可知,RibbonAutoConfiguration会在LoadBalance

2022-03-13 01:06:44 115

原创 SpringCloud组件-Eureka源码刨析

一、EurekaServer的启动流程查看eureka的启动starter依赖,eureka根据springboot自动装配的特点,会自动装配spring.factores中的类。查看spring-cloud-netflix-eureka-server中的spring.factores文件。文件内容为#org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration,自动装配了EurekaServerAutoCon

2022-03-12 20:40:50 521

原创 Spring中循环依赖问题

1、什么是Spring中的循环依赖循环依赖就是循环引用,也就是两个或者两个以上的Bean相互持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。2、Spring处理循环依赖的机制无法解决的循环依赖问题:单例Bean构造函数的循环依赖 prototype原型的循环依赖 (对与原型Bean的初始化过程中不论是通过构造器参数循环依赖还是通过setXxx方法产生循环依赖,Spring都会直接报错处理BeanCurrentlyInCreationException) 构造器的循环依赖

2022-02-07 18:12:32 1576

原创 JAVA面试高频率问题

1、springboot启动流程总览: 进行SpringBoot的初始化模块,配置一些基本的环境变量、资源、构造器、监听器 SpringApplication的run(Class clazz)方法会创建一个SpringApplication对象,在创建的初始化方法中会构建Spring框架所需要的环境变量、资源、构造器、监听器。 spring通过getSpringFactoriesInstances(Class clazz)方法来加载实例化构造器...

2021-12-24 13:52:38 362

原创 RocketMQ--消息生产者的启动以及消息的发送

一、消息发送public class SyncProducer { public static void main(String[] args) throws Exception { //Instantiate with a producer group name. DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");

2021-12-23 18:32:59 1333

原创 Mybatis-源码探究

一、mybatis的使用 // 1. 读取配置文件,读成字节输入流,注意:现在还没解析 InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2. 解析配置文件,封装Configuration对象 创建DefaultSqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSess

2021-12-21 17:09:14 56

原创 RocketMQ--nameServer启动流程

一、创建NameServerController,NameServerController为nameserver的核心控制器点击进入createNamesevController(arg)方法。创建NameServerConfig和NettyServerConfig,把配置文件中或者启动命令中的选项值填充到这两个配置对象中 #NamServerConfig#NettyServerConfig 2. 加载log配置 ...

2021-12-03 20:06:31 1716

原创 SpringBoot的启动流程

SpringApplication.run()执行run方法,run方法中会创建SpringApplication对象。进入SpringApplication的构造方法。构造方法中调过getSpringFactoriesInstances(ApplicationContextInitializer.class)通过ResourceLoader读取SpringBoot各个Starter启动器中的META-INF/spring.factories文件。并且根据类型加载监听器等。完成创建S...

2021-11-13 19:34:10 204

原创 在singleton的类中注入prototype的类

一般情况,如果在singleton的类中注入了prototype的Bean的时候,每次获取注入的Bean属性获取的都是同一个Bean实例。因为注入关联的Bean的动作只有一次,虽然被注入的类是多例的,但是每次获取的仍是开始初始化时的那个Bean。解决方案:通过类实现BeanFactoryAware接口或者ApplicationContext接口,每次get被注入的实例的时候从容器中通过getBean()方法获取。 lookup方法注入:通过在get方法上添加@LookUp注解即可。原理同第一种..

2021-11-03 16:33:13 134

空空如也

空空如也

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

TA关注的人

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