spring事务源码执行过程分析

上篇博客解析了事务生成动态代理对象的底层代码,简单总结的话就是一句话:如果添加了事务注解@Transactional,且方法是public的,spring就会给该bean生成代理对象,至于是jdk还是cglib,就看自己的事务方法对应的类是否实现了接口拦截器执行org.springframework.transaction.interceptor.TransactionInterceptor我在学习的时候,用的是cglib代理,因为我没有实现接口,所以使用的是CGLIB代理,在目标方法被调用的的时
分类: 其他 发布时间: 03-02 09:34 阅读次数: 0

mysql-回表查询是什么

在说到什么是回表查询的时候,有两个概念需要先解释清楚:分别是聚集索引(聚簇索引)和非聚集索引(非聚簇索引)聚集索引和非聚集索引MySQL规定,在使用InnoDB存储引擎的时候,必须且仅有一个聚集索引,非聚集索引也就是普通索引就看自己设置的有多少个了聚集索引和非聚集索引的区别:1.聚集索引中的非叶子节点存储的是表的主键,非聚集索引的非叶子节点存储的是自己设置的索引字段对应的值(如果是联合索引,那就是联合索引的几个字段对应的值)2.聚集索引的叶子节点,存储着当前表中每条记录的所有信息;非聚集索引的叶子
分类: 其他 发布时间: 03-02 09:34 阅读次数: 0

redis分布式锁+事务+AOP一起使用注意点

问题项目中使用的到了分布式锁,然后考虑到有多个业务接口都要加分布式锁,所以,就把分布式锁,放到了aop来处理,通过环绕通知来实现,但是在使用的时候,出现了问题:我加的切面是这样的@Component@Aspectpublic class RedisLockAspect { @Around("@annotation(com.test.RedisLock)") public Object lockRedisLock(ProceedingJoinPoint pjp) throws Th
分类: 其他 发布时间: 03-02 09:34 阅读次数: 0

springmvc学习一初始化源码

这两天,学习了一下springmvc的源码,主要是学习了启动和调用的流程,主要分以下两部分来记录笔记1.启动流程2.调用流程springmvc源码,先概括的说一下1、初始化handlerMapping对象、初始化handlerAdapter对象;在初始化handlerMapping对象的时候,会解析所有的bean,将controller和对应的URL存入到对应的map集合中2、在调用的时候,会调用到org.springframework.web.servlet.DispatcherServlet#
分类: 其他 发布时间: 03-02 09:33 阅读次数: 0

springmvc源码-调用

上篇博客主要记录了handlerMapping初始化时的一些笔记,这篇主要是调用过程的学习笔记调用在调用一个方法的时候,会通过HttpServlet、FrameworkServlet等进行调用,最终会调用到org.springframework.web.servlet.DispatcherServlet#doDispatch我们就从这个方法开始记录笔记在开始之前,有几个概念,先总结说明一下,上篇博客有说到过,声明一个controller的三种方式,这三种方式在调用的时候,是由不同的handler
分类: 其他 发布时间: 03-02 09:33 阅读次数: 0

spring自动注入模型

spring的注入,可以分为两种,分别是手动注入和自动注入我们这里要记录的是自动注入自动注入模型spring的自动注入模型有四种,分别是:autowire_no(0): 默认的装配模式,如果注入indexBean,没有在属性上加@Autowired或者@Resource,这时候,indexBean是无法注入的autowire_name(1): 通过set方法,并且set方法的名称必须和bean的name名称一致, byNameautowire_type(2): 通过set方法,这种方式set方
分类: 其他 发布时间: 03-02 09:33 阅读次数: 0

spring源码-@Autowired、@Resource注解底层原理

上篇博客说了自动注入模型的使用,这篇笔记打算记录下自动注入模型中,autowireMode为0的情况,也就是我们经常用到的@Autowired、@Resource注解的原理
分类: 其他 发布时间: 03-02 09:33 阅读次数: 0

juc-并发工具类源码解析

CountDownLatchCyclicBarrierSemaphore
分类: 其他 发布时间: 03-02 09:32 阅读次数: 0

mysql-MVCC机制

结论在对版本链中的事务ID进行比较时,有以下规则:如果版本链中的事务ID,落在最左边区域(tx_id < min_id),那表示当前版本是已经提交的事务,是可见的如果版本链中的事务ID,是落在右边部分(tx_id > max_id),表示这个版本是由将来启动的事务生成的(将来的事务,也就是当前session生成事务ID之后,有其他session生成的新的事务ID),是不可见的如果版本链中的事务ID,是落在中间区域(min_id <= tx_id <= max_id
分类: 其他 发布时间: 03-02 09:32 阅读次数: 0

根据ReentrantLock -- 解析AQS原理

java.util.concurrent.locks.AbstractQueuedSynchronizer是什么aqs,这是一个队列同步器框架,JUC中的公平锁、非公平锁、重入锁都是以aqs作为基础框架的,定义了加锁、释放锁,加共享锁等一些逻辑AQS是一个抽象类,内部使用了一个FIFO的等待队列,用于多线程等待锁排队,通过state表示当前资源的加锁状态;aqs是基础类,类中定义了模板方法,只需要实现对应的模板方法即可;aqs的作者是Doug Leaaqs内部维护的双向队列,大致是这样的,其中
分类: 其他 发布时间: 03-02 09:32 阅读次数: 0

spring源码-自动注入

在前面的博客中,介绍了@Autowired和@Resource注解的原理,这两种方式,我们认为是手动注入,这是spring默认的注入方式,如果我们要使用自动注入,需要设置自动注入模式autowireMode应用@Componentpublic class UserBean { private IndexBean indexBean; public UserBean(IndexBean indexBean) { System.out.println("userBean
分类: 其他 发布时间: 03-02 09:32 阅读次数: 0

springmvc源码-参数解析

该篇博客介绍了调用的部分逻辑,这篇主要介绍了实现Controller接口和实现HttpRequestHandler接口这两种方式的调用,这两种方式比较简单,就是通过强转,然后调用目标方法即可,麻烦的是下面这种,通过@Controller注解声明的controller,在这篇博客中会仔细介绍对于通过@Controller、@RequestMapping()这种通过注解,声明handlerMethod的方式,会分为以下三步:1.对请求中的参数进行解析2.调用目标方法3.对返回参数进行解析对参数进行解析
分类: 其他 发布时间: 03-02 09:31 阅读次数: 0

ThreadPoolExecutor源码学习(一) -核心属性及应用

在Executors类中,jdk提供了四个线程池可以使用,分别是newCachedThreadPool:corePoolSize是0,允许创建的最大线程数量是Integer.MAX_VALUEnewScheduledThreadPool:允许创建的最大线程数量是Integer.MAX_VALUEnewFixedThreadPool:任务队列允许的最大长度是Integer.MAX_VALUEnewSingleThreadExecutor:任务队列允许的最大长度是Integer.MAX_VALU
分类: 其他 发布时间: 03-02 09:31 阅读次数: 0

ThreadPoolExecutor线程池源码(二) - 核心源码

execute源码就直接从execute方法开始看了,初始化的就跳过了java.util.concurrent.ThreadPoolExecutor#executeexecute是提交任务的方法,我觉得核心的逻辑就在这个方法中在提交任务的时候,会判断当前线程池工作线程的数量是否小于corePoolSize,,如果小于,就添加核心线程如果工作线程数量大于corePoolSize,或者是添加核心线程失败,就判断线程池是否是running状态,如果是,将任务添加到任务队列中2.1、添加到任
分类: 其他 发布时间: 03-02 09:31 阅读次数: 0

springmvc应用-自定义参数解析器

通过自定义
分类: 其他 发布时间: 03-02 09:31 阅读次数: 0

dubbo 自定义filter

目的通过自定义filter,在dubbo接口被调用的时候,打印入参信息、请求接口名称和返回值信息,这样可以避免在每个接口中手动打印接口请求的入参等日志,实现统一打印日志的方式有多种,这里只是为了学习自定义filter,所以以这个为例应用要实现自定义filter,需要有以下几个步骤1.自定义filter实现类@Activate(group = "provider")public class DubboProviderLogFilter implements Filter { @Overri
分类: 其他 发布时间: 03-02 09:30 阅读次数: 0

spring源码 第二个后置处理器方法的使用-推断构造函数

spring一个bean初始化以及销毁的流程中,有九个后置处理器需要执行,这篇博客主要记录第二个后置处理器推断构造函数的后置处理器的源码逻辑第一个后置处理器的调用在第一个后置处理器被调用之前,会进行一系列的判断会先调用第一个后置处理器,判断是否返回了bean,如果返回了bean,且不为null,就直接调用第八个后置处理器,完成bean的代理,然后return了之后,就结束了一个bean的生命周期,也即:一个bean就初始化完成了第一个后置处理器是:org.springframework.beans.
分类: 其他 发布时间: 03-02 09:30 阅读次数: 0

rocketmq云服务搭建踩坑

Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to xx.xx.xx.xx:10911 failed最近在学习rocketmq,自己尝试买了一台云服务器,就在云服务器上直接搭建了,现尝试的是单机版的在启动的时候,没问题,但是在我通过代码去尝试发送代码的时候,发送失败,控制台打印该报错解决办法:在broker.conf配置文件中,增加以下两个配置namesrvAddr=公网IP
分类: 其他 发布时间: 03-02 09:30 阅读次数: 0

spring源码-第三个后置处理器

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean在spring源码中,这个方法中,完成了第二个到第八个后置处理器的调用,前面的推断构造函数的笔记中,记录了对第二个后置处理器的调用,这篇笔记,主要记录第三个后置处理器的使用源码synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { try {
分类: 其他 发布时间: 03-02 09:30 阅读次数: 0

spring源码-第四个后置处理器

这是第四个后置处理器的源码学习笔记
分类: 其他 发布时间: 03-02 09:29 阅读次数: 0