自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot整合Aop源码之动态代理调用分析

本文分析了Cglib代理的请求过程的源码,可以总结简化出如下两点调用步骤1.把能应用于目标对象的Advisor数组转换为包含各种前置通知、异常通知、后置通知等的MethodInterceptor对象集合。2.通过责任链模式依次调用MethodInterceptor对象的invoke方法执行通知方法,在后置通知中有个finally代码块会最后被执行。

2024-02-12 22:59:45 686 1

原创 SpringBoot整合Aop源码之Aop生成动态Cglib代理源码分析

1.AOP先通过AnnotationAwareAspectJAutoProxyCreator的postProcessBeforeInstantiation创建一个增强器的集合,创建的逻辑主要是查找spring容器中标有@Aspectj注解的类,并且方法标有Pointcut、Around、Before、After、AfterReturning、AfterThrowing注解给他们封装为增强器对象。

2024-02-12 22:57:06 1104

原创 SpringBoot整合Aop源码之Aop的加载过程分析

什么是AOP?AOP(面向切面编程)是一种软件开发范式,旨在通过在程序中插入称为“切面”的特殊代码,来提高代码的可维护性、可重用性和可扩展性。切面是与业务逻辑无关的代码,用于横切关注点,例如日志记录、性能监测、事务管理等。在传统的面向对象编程中,应用程序的逻辑通常被分解为多个对象,这些对象协同工作以完成任务。而AOP允许你通过横切关注点的方式来封装这些协同工作,从而提高代码的模块化程度。AOP中的关键概念切面是一个模块化单元,其中包含有关横切关注点的信息。它包含了切点、通知和一些其他配置。切点是一个表达式,

2024-02-12 22:53:57 736 1

原创 SpringBoot整合Ribbon源码分析之核心组件之间调用流程分析

通过这个方法还可以看出一个知识点,就是nextIndex是CAS操作,它是一个原子操作,它是比较内存中的值和当前值是否相等,如果相等把值设置为指定的值,如果不等,会在死循环for中判断直到相等为止才返回。

2024-02-08 00:02:24 671

原创 SpringBoot整合Ribbon源码分析之核心组件加载原理

在我的初次探讨中,我深入剖析了Ribbon的核心构建要素。NacosRibbonClientConfiguration会先加载里面的Bean,如果没有会加载RibbonClientConfiguration中的Bean,而RibbonClientConfiguration中的Bean都是@ConditionalOnMissingBean标注的,这表明如果容器中存在这个Bean就不会加载这个Bean,以我们的NacosRibbonClientConfiguration中配置的Bean为最优先加载的。

2024-02-08 00:00:08 1326

原创 SpringBoot整合Ribbon源码分析之Ribbon简介和核心组件

维护着一组Server实例列表,在应该程序运行过程中,Ribbon通过ServerList中的服务实例供负载均衡选择,ServerList维护的实例列表可能在运行过程中发生动态变化。

2024-02-07 23:52:43 418 1

原创 Spring Cloud OpenFeign源码请求原理解析

请求到达时候会调用FeignInvocationHandler的invoke方法,创建一个RequestTemplate对象设置请求头参数等信息,这些可能是在请求拦截器中设置的,接着调用远程服务获取响应对象,把响应对象解码成为我们Feign接口返回的类型,当服务不可用时候还可以进行重试机制,默认最大为5次,如果5次过后还是请求不到会抛出异常。总体来说,这段代码的作用是在发生可重试异常时,判断是否需要进行重试,如果需要,计算下一次重试的时间间隔,并在间隔后进行重试。

2024-02-05 09:05:49 817 1

原创 Spring Cloud OpenFeign源码FeignClientFactoryBean原理

接着创建一个数据结构是Map<Method, MethodHandler>的对象,遍历标有@FeginClient注解的接口类的方法,这个方法是通过反射获取的,是java.lang.reflect.Method对象,放入到Map中,key是java.lang.reflect.Method对象对象,value是MethodHandler对象,该对象是通过ParseHandlersByName的apply方法封装而来的。由于这个方法代码量很大就不在此做分析了。new Class<?

2024-02-04 18:36:35 785

原创 Spring Cloud OpenFeign源码加载原理

本节主要分析了Feign是怎么被加载到Spring容器中的,其实主要就是在我们的启动类中添加@EnableFeignClients注解,然后注解又引入了一个FeignClientsRegistrar,它是Spring容器会回调的一个类,它是去指定的包路径下寻找所有子包标有@FeginClient注解的类并把他们封装为FeignClientFactoryBean类型的Bean加载到spring容器中。根据Map获取@Feign注解的value值,又调用了。

2024-02-04 18:31:03 737 1

原创 SpringBoot整合Mybatis-Plus源码分析(二)

MybatisSqlSessionFactoryBean对象的getObject()方法的主要处理逻辑就是设置自定义相应的别名包中的类、自定义的java类和数据库映射的TypeHandler设置到MybatisConfiguration对象上,同时解析mapper.xml中的标签和CRUD的sql语句到MybatisConfiguration对象上,最后MybatisConfiguration对象设置到SqlSessionFactory对象成员属性上进行返回,这样就有了数据库各种的sql语句了。

2023-06-21 21:33:07 191

原创 SpringBoot整合Mybatis-Plus源码分析(一)

例如,可以通过配置 mybatis-plus.mapper-locations 属性指定 Mapper 接口的扫描路径,或者通过配置 mybatis-plus.global-config.db-config.logic-delete-value 和 mybatis-plus.global-config.db-config.logic-not-delete-value 属性指定逻辑删除的值。Mybatis-Plus 是 Mybatis 的增强工具包,可以简化 Mybatis 的开发,提高开发效率和代码质量。

2023-06-21 21:30:32 461

原创 关于Java8中为什么日期LocalDate是线程安全的分析

前几篇文章分析了Java8中新的日期API各种类的用法,这篇文章分析一下新的API为什么是线程安全的,Java 8 的日期和时间类之所以是线程安全的,因为它们是不可变的(immutable)。在这个示例中,我们创建了两个线程,并且每个线程都使用LocalDate.now()方法获取当前日期,并将其打印出来。当然,如果在多线程中把他用作成员变量的话应该加final关键字修饰,不能让这个变量在别的线程中指向新的对象,那样还是线程不安全的,例如在别的线程又重新赋值一遍。那么其余线程看到的日期的状态将会被改变。

2023-06-18 15:54:52 582 1

原创 Java8中UTC的概念和Java8中新的日期Api UTC和本地时间时间转换

例如,java.time.LocalDateTime 表示本地日期和时间,而 java.time.ZonedDateTime 表示特定时区的日期和时间。它是基于原子钟的国际时间标准,与地球自转无关,通过原子钟的精确测量来确保时间的一致性。通过以上代码示例,您可以获取当前的 UTC 日期时间,并将其转换为本地时间以供使用。在应用程序中,使用 UTC 时间有助于确保时间的一致性和可比性。请注意,UTC 时间并不考虑夏令时调整,因此在进行本地时间转换时,可能会考虑当前系统所处的时区以进行相应的调整。

2023-06-18 15:53:26 2952 1

原创 Java8 Duration和Period详细分析

Duration`和`Period`类提供了对时间间隔和日期间隔的处理和操作。`Duration`适用于处理较短的时间间隔,涉及时分秒和纳秒级别的差距,而`Period`适用于处理较长的日期间隔,涉及年、月和日的差距。Java 8引入了`Duration`和`Period`类,用于处理时间间隔和日期间隔的不同情况。- 可以使用静态方法`of()`创建`Duration`对象,传递不同单位的时间值。- 可以使用静态方法`of()`创建`Period`对象,传递年、月和日的值。

2023-06-16 12:01:52 334 1

原创 Java8时间类Instant以及ZoneId用法

/ 将Instant对象转换为指定时区的ZonedDateTime对象。它是不可变的,可以用来表示一个时间戳,例如系统的当前时间。这些是Instant类和ZoneId类的一些常见用法示例,可以根据具体需求进行进一步学习和应用。它定义了世界上各个时区的标识符,并提供了一些有用的方法来操作时区。在java 8中,Instant类和ZoneId类是用于处理日期和时间的重要类。

2023-06-13 09:40:29 1406 1

原创 Java 8 TemporalAdjusters 使用详解

TemporalAdjusters` 类提供了一些常用的日期调整器,如 `next()`、`previous()`、`firstDayOfMonth()`、`lastDayOfMonth()` 等,方便我们对日期进行灵活的调整和定位。你也可以根据需要自定义日期时间调整器,通过实现 `TemporalAdjuster` 接口来实现自定义的调整逻辑。`TemporalAdjusters` 类是 Java 8 提供的工具类,用于进行日期时间的调整和定位。// 自定义调整器:将日期调整为下一个工作日(跳过周末)

2023-06-12 16:51:29 582 1

原创 Java8 LocalDate使用详解

这些代码示例展示了 `LocalDate` 类的一些常用操作和方法。请注意,`LocalDate` 是不可变的,每个操作都会返回一个新的 `LocalDate` 对象,原始对象不会被修改。`LocalDate` 类是 Java 8 新增的日期时间类之一,用于表示不包含时间的日期。下面是对 `LocalDate` 类的详细分析,并给出一些代码说明。// 获取星期几(返回一个枚举值)// 比较两个日期的先后顺序。// 判断两个日期是否相等。// 格式化日期为字符串。// 解析字符串为日期。

2023-06-11 08:47:13 216 1

原创 Java8 LocalTime使用详解

这些代码示例展示了 `LocalTime` 类的一些常用操作和方法。请注意,`LocalTime` 是不可变的,每个操作都会返回一个新的 `LocalTime` 对象,原始对象不会被修改。`LocalTime` 类是 java 8 新增的日期时间类之一,用于表示不包含日期的时间。下面是对 `LocalTime` 类的详细分析,并给出一些代码说明。// 获取时间的纳秒部分(仅适用于 Java 9+)// 比较两个时间的先后顺序。// 判断两个时间是否相等。// 格式化时间为字符串。// 解析字符串为时间。

2023-06-10 21:03:26 679

空空如也

空空如也

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

TA关注的人

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