自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分布式事务实战八(Spring事务失效场景)

我们是不是在方法上加了@Transactional注解,那么事务就一定会生效吗?事务失效的场景有非常非常多,这里主要介绍几种常见的事务失效场景:首先我们来看最简单的一种事务失效场景,如下图:如果我们像上图一样,将FlowRechargeCenterServiceImpl类中的@Service注解给注释掉的话,那么这个FlowRechargeCenterServiceImpl就不会交给Spring管理,那么此时就会导致事务失效!那么为什么会失效呢?我们知道,@Transactional是基于AOP来实

2022-04-14 20:51:51 685

原创 java虚拟机的内存管理二

Java 堆概念对于Java应用程序来说, Java堆(Java Heap) 是虚拟机管理的内存中最大的一块。 Java堆是被所有线程共享的一块内存区域, 在虚拟机启动时创建。 此内存区域的唯一目的就是存放对象实例, Java 世界里几乎所有的对象实例都在这里分配内存。堆的特点1、是Java虚拟机所管理的内存中最大的一块2、堆是jvm所有线程共享的。3、在虚拟机启动的时候创建。4、唯一目的就是存放对象实例,几乎所有的对象实例以及数组都要在这里分配内存。5、Java堆是垃圾收集器管理的主要

2022-04-13 21:10:51 385

原创 分布式事务实战八(Spring事务框架源码初探五)

经过前边几节的讲解,我们知道,@Transactional的核心其实就是BeanFactoryTransactionAttributeSourceAdvisor这个Advisor了。而这个BeanFactoryTransactionAttributeSourceAdvisor中有几个极为重要的方法,比如getPointcut()方法会返回切点信息,用于匹配判断一个bean在初始化过程中是否需要创建代理对象,再比如getAdvice方法会返回TransactionInterceptor拦截器,事务处理的核心逻

2022-04-13 20:08:28 332

原创 java虚拟机的内存管理一

2022-04-12 21:59:42 1246

原创 分布式事务实战八(Spring事务框架源码初探四)

在前边几节的分析,我们知道,@Transactional是基于AOP实现的,而在创建事务代理之前,会为@Transactional所在的类匹配相应的增强,匹配的时候呢,会分别在类级别和方法级别进行匹配。而在类级别和方法级别都满足后,就会将匹配成功的增强返回,而这里返回的增强其实就是BeanFactoryTransactionAttributeSourceAdvisor,我们知道,在BeanFactoryTransactionAttributeSourceAdvisor中有一个非常关键的属性,那就是advic

2022-04-12 20:27:12 488

原创 分布式事务实战八(Spring事务框架源码初探三)

上节我们分析了TransactionInterceptor增强的匹配过程,我们知道,其实在匹配的时候,和之前的AOP一样,也分为了类级别的方法级别的匹配。并且通过上节的分析,我们知道,在方法级别匹配的时候,判断方法级别是否匹配成功,依赖于是否获取到事务属性。这一节我们就来分析下,在方法级别匹配时,获取事务属性的过程。我们就接着上节,继续往下分析吧,那么分析的入口就是下边这行代码,如下图:可以看到,上图红框中的代码,就是上节分析方法级别匹配时,获取事务属性的代码了。我们就直接进去getTransacti

2022-04-12 20:24:27 316

原创 分布式事务实战八(Spring事务框架源码初探二)

上节我们分析了TransactionInterceptor控制事务的内部实现细节,简单一句话来总结的话,那就是TransactionInterceptor其实是通过jdbc的API来控制数据库事务的。那么到目前为止,我们知道,@Transactional注解是基于AOP来实现的,而我们知道AOP的核心,就是为目标方法添加一些增强,比如TransactionInterceptor增强,那怎么判断,应该为目标方法添加哪些增强呢?其实,应该添加哪些增强,是通过与目标类和目标方法匹配的结果来判断的,比如我们之前就讲

2022-04-11 22:57:19 536

原创 分布式事务实战八(Spring事务框架源码初探一)

通过上节的讲解,我们现在已经知道,基于AOP是可以实现与@Transactional注解相似的效果,其实@Transactional注解就是基于AOP来实现的呢?因为我们知道,从IOC容器获取bean的时候,是有可能获取到一个代理对象的,也就是说上边获取的flowRechargeCenterService这个bean可能就是一个代理对象,然后在这个代理对象中实现了开启事务、回滚事务和提交事务的逻辑。我们使用debug看一下,我们可以debug来看下flowRechargeCenterService这个bea

2022-04-11 21:17:09 205

原创 分布式事务实战八(Spring事务框架源码初探之基于AOP思想与动态代理无缝插入事务支持)

spring对我们的service组件创建了一个动态代理,你加了@Transactional注解之后,就对这个动态代理插入了事务管理的增强逻辑,开始执行方法之前先开启事务,方法中有报错就回滚事务,如果没有报错就提提交事务。如下图:我们可以基于AOP先来模拟下@Transactional的效果,其实AOP的本质就是动态代理,而动态代理说白了就是一种代理模式,通过代理模式我们可以额外添加一些增强逻辑。因此我们可以利用代理类中的增强逻辑来实现@Transactional注解的效果,那么这个是什么意思呢?我们可

2022-04-10 14:41:59 542

原创 分布式事务实战七(为流量充值中心加入事务)

我们看下我们流量充值中心执行步骤,哪些步骤是需要进行事务管理的:(1)完成支付转账。(2)创建充值订单:充值订单显示的是支付成功(3)调用第三方运营商系统完成流量充值。(4)发送短信通知用户,流量充值成功:系统还给用户发了一个短信,提示用户流量已经充值成功了。(5)给用户增加一次抽奖的机会:用户新增一次抽奖的机会。(6)给用户增加充值面额5%的积分:用户增加了积分。(7)如果使用了流量券的话,要将流量券的状态更新为:流量券状态也改变了,已经使用了。(8)如果充值的流量套餐有赠送流量券的活动,

2022-04-10 10:34:06 370 1

原创 Spring AOP源码分析十三

当时我们找创建AOP代理的入口时,通过debug,发现了上边几个beanPostProcessor,然后我们通过名字,猜测AnnotationAwareAspectJAutoProxyCreator这个beanPostProcessor很有可能就是创建AOP代理的入口。那这个AnnotationAwareAspectJAutoProxyCreator也是Spring中的一个bean,那么这个bean在什么条件下才会注入进来?它的注入过程又是怎么样的呢?现在我们要来分析的是,创建AOP代理的入口,也就是Ann

2022-04-09 14:42:10 425

原创 Spring AOP源码分析十二

到目前为止,我们详细分析了jdk动态代理创建的整个流程,以及jdk动态代理执行的整个流程。我们知道,AOP代理其实分为jdk代理和cglib代理,接下来我们就要开始分析cglib代理,我们简单来回顾一下,我们看下边这张图:这里最重要的其实就是config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)这行代码了。首先config.isOptimize()表示是否开启了优化策略,

2022-04-09 09:13:44 336

原创 Spring AOP源码分析十一

上节我们分析了拦截器ExposeInvocationInterceptor和AspectJAfterThrowingAdvice的核心逻辑,我们现在知道,其实拦截器的核心逻辑,就是不断的递归调用ReflectiveMethodInvocation,而通过每个拦截器中的递归调用,就可以将这些拦截器连成一根链条。同时每个拦截器中还会实现自己的一些增强逻辑,比如ExposeInvocationInterceptor拦截器实现了同线程共用拦截器链的功能,而AspectJAfterThrowingAdvice拦截器在

2022-04-07 20:30:06 642

原创 Spring AOP源码分析十

上一节中,我们将getInterceptors()方法就分析完毕了,说白了就是将增强advisor转换为拦截器MethodInterceptor的流程。这个时候我们就要和之前分析的invoke()方法的流程串起来了,不知道大家还记不记得,那就是之前分析invoke()方法时,我们一共有两个地方的细节都给跳过去了,一个是获取拦截器链的过程,另外一个就是拦截器链的执行过程。在上一节的内容中,其实就是增强advisor转换为拦截器MethodInterceptor的过程,拦截器最终会被放入到拦截器链中,而拦截器链

2022-04-06 21:27:21 1239

原创 Spring AOP源码分析九

上一节我们主要讲了目标方法和增强的匹配过程,简单说就是首先在类级别进行匹配,接着在方法级别进行匹配,如果匹配成功的话,就通过registry.getInterceptors(advisor)这行代码获取advisor对应的拦截器,然后将这些拦截器放到一个集合中,这个集合其实就是拦截器链,最后将拦截器链作为结果进行返回。这个过程还是比较简单的,但是其中有一行代码我们跳了过去,那就是获取advisor对应的拦截器这个过程我们还不清楚,所以这节我们就专门来分析一下这个过程,说白了就是来分析下registry.ge

2022-04-05 11:02:30 666

原创 Spring AOP源码分析八

在上一篇文章的中,我们知道了invoke()方法的核心处理流程,其实就是先对特定方法进行处理,然后再获取目标方法的拦截器链,最后执行拦截器链并返回结果。但是具体是怎么获取目标方法对应拦截器链的?又是怎么执行拦截器链的?这些我们目前都不清楚,我们今天主要就是来分析一下拦截器链的获取过程,分析入口就是下边这行代码:通过上边的代码,我们可以看到,这个获取拦截器链的核心逻辑都封装在这个getInterceptorsAndDynamicInterceptionAdvice()方法中。那我们直接点进来看下,此时就会

2022-04-03 20:59:45 317

原创 JVM介绍一

什么是JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。目前主流的虚拟机有:虚拟机名称介绍HotSpotOracle/Sun JDK和OpenJDK都使用HotSPot VM的相同核心J9J9是IBM开发的高度模块化的JVMJRockitJRockit 与 HotSpot 同属于 Oracle,目前为止 Oracle 一直在推

2022-04-03 10:20:58 1270

原创 Spring AOP源码分析七

上一篇中,我们通过JDK动态代理已经生成了代理对象,AOP通过JDK创建的动态代理对象,最终都会执行JdkDynamicAopProxy类的invoke()方法,而在这个invoke()方法中,就会来执行目标方法和切面中的增强逻辑了,那执行过程到底是怎么样的呢?我们今天就来分析下这个invoke()方法:public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object oldProxy

2022-04-02 21:57:26 896

原创 Spring AOP源码分析六

上篇文章我们详细分析了下代理工厂ProxyFactory,我们知道在ProxyFactory创建好之后,Spring会为ProxyFactory设置很多核心的属性,其中就包括非常核心的拦截器,这个拦截器包含我们切面中的增强拦截器和普通的拦截器。到这里为止,创建代理的准备工作就准备好了,那么本篇文章就接着往下分析,来看下Spring到底是怎么创建代理的。现在创建代理的准备工作都完成了,那么接下来就会来执行这行代码proxyFactory.getProxy(getProxyClassLoader()),如下图:

2022-04-01 21:30:42 572

原创 Spring AOP源码分析五

到目前为止,我们已经获取到了当前bean对应的拦截器(增强),接下来就是拿着这些拦截器来生成动态代理了,那么从这篇文章开始,我们就会一步一步来分析AOP创建代理的流程,分析入口当然是这个createProxy()方法方法了:那接下来,我们就直接到createProxy()方法中看下: protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specifi

2022-03-31 21:14:35 893

原创 Spring AOP源码分析四

上篇文章我们分析了切点表达式与目标类匹配的前半部分,也就是类级别的匹配,而这篇文章我们就来看最最核心的一块,那就是方法级别的精确匹配。在开始分析之前,我们先来猜测一下方法精确匹配,可能会从哪几个维度进行匹配,首先我们知道方法中比较重要的“属性”分别有方法参数、方法名字、方法返回值等信息,那么方法精确匹配是不是从这几个维度下手,进行的匹配呢?上篇文章我们分析到了这个地方,大家先来回顾一下,如下图:现在我们知道obtainPointcutExpression()方法返回的是一个PointcutExpress

2022-03-30 21:15:09 814

原创 Spring AOP源码分析三

上篇文章我们已经获取了切面类中自己声明的方法,我们接着之前的代码进行分析,我们继续分析Spring是如何获取增强方法上的AspectJ注解信息的并且如何对增强方法进行匹配的,我们回到之前我们分析的代码:现在这个getAdvisorMethods() 方法会返回before()、afterReturning()、getOrder()这三个方法。接着就是遍历依次处理这个三个方法,我们来看一下:这个行代码就是调用了getAdvisor() 方法,从切面类中获取的method传递进去。我们到这个getAdv

2022-03-29 21:41:56 918

原创 Spring AOP源码分析二

上一篇中,我们已经找到了AOP的源码入口,我们今天继续分析下面的源码,不过在此之前我们需要看下Spring中如何使用切面的。

2022-03-28 22:23:58 947 2

原创 Spring AOP源码分析一

我们之前分析了Spring bean创建的核心源码以及Spring相关注解的源码,这一节开始我们就要开始分析Spring AOP的源码,那这个Spring AOP的源码该如何分析呢?还记得我们分析创建bean核心流程,在创建bean的时候提供了各种bean的后置处理器,我们知道AOP就是用来创建代理对象的,用来给对象进行增强。既然是创建代理对象,所以这个bean肯定不是spring自己通过jdk创建的,所以这个应该是在bean实例化之前进行代理的。我们可以看到在bean创建之前,提供了一个机会创建生成代

2022-03-27 20:12:33 947 2

原创 SpringCloud Alibaba 九(Seata介绍二)

我们会在项目中创建三个服务,仓储服务,订单服务,帐户服务。当用户下单时,会在订单服务中创建一个订单,然后通过远程调用仓储服务来扣减下单商品的库存,再通过远程调用账户服务来扣减用户账户里面的余额。该操作跨越三个数据库,有两次远程调用,很明显会有分布式事务问题。

2022-03-27 12:04:15 512

原创 SpringCloud Alibaba 八(Seata介绍一)

Seata是什么seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。Seata 分布式事相关概念Transaction ID XID :全局唯一的事务IDTransaction Coordinator (TC): 事务协调者,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚;Transaction Manager ™:事务管理器,

2022-03-26 10:41:52 998

原创 SpringCloud Alibaba 七(Sentinel服务熔断与持久化)

在演示这个Sentinel 服务熔断功能之前,我们先讲解一下Sentinel 关键注解@SentinelResource的用法。我们知道在Hystrix 中也有HystrixCommand 注解,通过这个注解我们可以自定义我们的降级规则,而Sentinel的@SentinelResource也是有类似的功能的,我们接下来就通过一些案例演示一下:按资源名称限流我们修改我们的项目:新建 model 包:新增Result类:package com.younger.pcloud.alibaba.mode

2022-03-25 22:03:56 905

原创 Spring注解源码解析六

上一篇中,我们了解了@Autowire注解的底层原理,Spring会通过Bean的后处理器AutowiredAnnotationBeanPostProcessor,解析bean实例中的字段和方法上的注解@Autowired,最后会将对应的注解信息注入到属性或者方法参数上。今天我们看下另外的两个注解@PostConstruct和@PreDestroy。我们要分析注解@PostConstruct和注解@PreDestory的底层源码,我们得要先找到源码的入口在哪,那Spring到底是在什么时候解析这两个注解的

2022-03-25 10:11:39 785

原创 SpringCloud Alibaba 六(Sentinel各种规则)

在之前的内容中,我们介绍了Sentinel相关信息以及怎么把Sentinel整合到我们的项目中,接下来我们要开始学习Sentinel的各种规则。

2022-03-24 18:26:31 898

原创 Spring注解源码解析五

上一节,我们已经了解了@Configuration注解如何与@Bean注解一起使用,本节中,我们将要了解Spring是如何通过@AutoWare注解为bean注入属性值的。要分析注解@Autowired的源码,同样的,我们还得要到注解@Autowired类中寻找源码入口的线索:在注解@Autowired类中发现AutowiredAnnotationBeanPostProcessor应该就是注解@Autowired的解析入口。那这个AutowiredAnnotationBeanPostProcessor是

2022-03-24 09:33:20 637

原创 Spring注解源码解析四

上一篇中,我们了解了注解@Configuration是如何结合注解@Bean使用了,而且我们也知道Spring在初始化时,会执行工厂后处理器ConfigurationClassPostProcessor中的方法,来处理注解@Configuration标准的注解配置类了。经过方法postProcessBeanDefinitionRegistry的分析,我们知道了Spring首先会过滤出这些添加了注解@Configuration的注解配置类,然后为注解配置类中的每个注解@Bean标准的方法,都创建一个BeanD

2022-03-23 15:41:14 555

原创 SpringCloud Alibaba 五(Sentinel介绍)

Sentinel是是什么?随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性,说白了其实就是我们之前讲过的Hystrix。Sentinel 主要特征Sentinel官网地址: https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibab

2022-03-23 11:11:05 1123

原创 分布式事务实战六(事务的基础知识介绍)

在学习分布式事务之前,我们需要先了解下事务的相关知识。事务的ACIDAtomic:原子性,就是很多的sql一起执行,要么一起成功,要们都不执行,不允许某个SQL执行成功,某个SQL执行失败了。Consistency:一致性,这个是针对数据一致性来说的,就是一组SQL执行之前,数据是没有问题的,执行之后,这个数据也必须是没有问题的,不要执行完了SQL结果应该需要修改的数据没有执行。Isolation: 隔离性,这个说的是多个事务在执行的时候是不能相互干扰的,不要事务A操作了某个数据,事务B过来把这数

2022-03-23 10:25:24 1287

原创 SpringCloud Alibaba 四(Nacos集群搭建)

Nacos 集群部署架构Nacos 官网推荐了三种连接方式:http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。http://SLB:port/openAPI 挂载SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),直连SLB即可,下面挂server真实ip,可读性不好。http://nacos.com:port/openAPI 域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式这个架构图看了

2022-03-22 18:39:04 3653

原创 Spring注解源码解析三

上一节,我们已经分析了通过注解来配置bean,也就是通过@Coponent注解来配置bean,Spring容器启动时就会到指定的路径下扫描,如果发现某个类上标注了@Component注解,就会像扫描xml中的bean标签一样,将类中的信息封装为BeanDefinition并注册Spring容器中。接下来我们学习通过注解@Configuration和注解@Bean来配置bean。

2022-03-22 14:00:52 732

原创 Spring注解源码解析二

在前面的章节中,我们了解了注解的一些用法,并且模拟了Spring是如何通过注解来加载bean的,这一节我们就要开始深入到Spring源码,看下我们常用的注解是如何发挥作用的。我们先看下这个@Component是如何使用的,我们通过一个案例体验一下:我们新建一个user8 类,但是我们不需要将User8通过xml进行配置,而是在类上面新增了一个@Component注解。我们现在是分析的是注解相关的操作,所以我们这里采用的是Spring容器的类型是AnnoationConfigApplicationC

2022-03-21 22:50:40 575

原创 SpringCloud Alibaba 三(Nacos作为服务注册中心二)

上一节,我们学习了Nacos作为注册中心进行服务的注册,我们前面也提到过Nacos不仅可以作为注册中心,Nacos也包含配置中心的功能。接下来我们学习Nacos的配置中心如何使用?

2022-03-21 18:20:11 600

原创 Spring注解源码解析一

我们们之前对Spring容器的初始化和bean的加载过程都做了相应的分析,不过我们之前分析源码入口是xml配置和BeanFactory,在我们的实际项目中,现在都不使用xml配置bean了。我们更多的是使用Spring提供的各种注解,比如@Bean、@Controller、@Component、@Service、@Autowired等注解。所以我们从本节开始就要对这些注解源码进行分析了。注解是什么呢?我们这里定义了一个名字叫做MyComponent的注解其实,注解本质就是一个接口,只不过是继承了An

2022-03-21 11:09:09 1789 3

原创 Spring源码解析二十七(bean的初始化)

前面我们已经了解了Spring如何为bean填充属性,而且,在属性填充时还涉及到三种自动装配模式,分别是根据名称、类型以及构造方法来自动装配bean的属性。完成bean属性装配之后,接下来就要开始bean的初始化了。

2022-03-20 22:49:21 699

原创 SpringCloud Alibaba 三(Nacos作为服务注册中心一)

在上一篇中我们介绍了Nacos并且安装了Nacos,在这一篇中我们将要使用Nacos作为注册中心进行演示。

2022-03-20 18:32:15 153

hyperledgerfabric1.4的区块链完整资料

hyperledgerfabric1.4的区块链完整资料

2023-08-07

SpringCloud2020.html

SpringCloud2020.html

2021-06-30

空空如也

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

TA关注的人

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