![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JAVA源码剖析
文章平均质量分 81
java企业开发主流框架源码剖析
躺平程序猿
这个作者很懒,什么都没留下…
展开
-
@Async错误使用导致Spring循环依赖报错
注:首先如果程序中出现了循环依赖本身就是程序设计存在问题,尽量在设计上避免出现循环依赖。在springboot框架中已经默认不支持循环依赖的存在了,除非设置spring.main.allow-circular-references=true问题概述This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching -原创 2022-04-17 00:17:37 · 6632 阅读 · 2 评论 -
SpringDataJPA+Hibernate框架源码剖析(五)框架整合 之 SpringBoot整合JPA剖析
SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建(包括spring的事务机制)原创 2022-02-23 21:40:11 · 829 阅读 · 0 评论 -
SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别
SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建(包括spring的事务机制)原创 2022-02-21 22:08:50 · 1290 阅读 · 0 评论 -
SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建(包括spring的事务机制)
SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建(包括spring的事务机制)原创 2022-02-21 21:35:48 · 546 阅读 · 0 评论 -
SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成
SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建SpringDataJPA+H原创 2022-02-21 21:10:36 · 511 阅读 · 0 评论 -
SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建
SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建SpringDataJPA+H原创 2022-02-21 20:45:53 · 1592 阅读 · 0 评论 -
SpringDataJPA+Hibernate框架源码剖析(一)框架介绍
SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建SpringDataJPA+H原创 2022-02-21 20:26:34 · 1180 阅读 · 0 评论 -
JVM的Reference机制
1.finalizer生产大于消费导致内存溢出测试User重写了finalize方法的类在创建User对象的同时会创建一个Finalizer对象并加入到Finalizer中以unfinalized为头节点的链表中,当触发GC时如果垃圾收集器判断User对象没有与GCRoot的强引用时则会将Finalizer放到Reference.pending属性上,由线程ReferenceHandler负责处理将Finalizer添加到Finalizer.queue中,然后由线程FinalizerThread负责处理,原创 2022-01-10 11:04:42 · 476 阅读 · 0 评论 -
java的SPI机制(jdk1.8)
SPI全名Service Provider Interface(服务提供者接口),SPI的主要目的是实现服务的热插拔效果,主要应对的场景是设计者提供一个接口,这个接口的具体实现由不同厂商提供,设计者只要引入厂商提供的实现jar包就可以自动装配,无需改动代码。例如:JDBC的驱动加载。SPI机制满足:不需要改动源码就可以实现扩展,解耦。实现扩展对原来的代码几乎没有侵入性。只需要添加配置就可以实现扩展,符合开闭原则。其实很多知名框架的自动装配都是借鉴了JDK的SPI机制如SpringBoot的star原创 2021-07-19 01:27:18 · 490 阅读 · 2 评论 -
SpringBoot启动流程原理+自动装配原理
SpringBoot 设计的目的是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。SpringBoot相对Spring的优点主要有两个:1.起步依赖-会将很多jar包按照功能合并成stater整体进行版本管理和引用,解决Spring集成其他框架时jar版本管理问题2.自动装配-引入相关的jar包后SpringBoot会自动注册一些比较关键的bean,并进行默认配置,不用我们进行特殊配置,解决Spring重量级XML配置问题。比如整合Mybatis时的SqlSessionFac原创 2021-02-17 01:31:13 · 6701 阅读 · 29 评论 -
探讨整合Spring前提下Jpa的EntityManager和Mybatis的SqlSession在不加@Transactional时会不会占用连接不释放(待完善)
探讨整合Spring前提下Jpa的EntityManager和Mybatis的SqlSession在不加@Transactional时会不会占用连接不释放(核心方法TransactionSynchronizationManager#isSynchronizationActive()用于判断是否开启事务);EntityManager会主动释放连接,SqlSession不会主动释放连接,但是Mapper动态代理类(引用了mybatis-spring.jar整合后产生的Mapper代理类中的SqlSessi原创 2021-02-10 13:34:41 · 2032 阅读 · 0 评论 -
Spring事务流程源码剖析+传播行为运用案例+心得
总结:Spring的事务本质上就是操作数据库的事务一、Spring事务流程源码剖析Spring的声明式事务处理是通过AOP切面实现的核心逻辑在TransactionAspectSupport#invokeWithinTransaction中(这里不在赘述代理类如何生成以及切面何时进入,如有疑问可以参考SpringAOP之代理对象的创建、SpringAOP之代理对象的执行、Spring声明式事务控制原理之声明式事务的重要组件(注解实现)以及之间关系、Spring声明式事务控制原理之声明式事务的重要组件在A原创 2021-02-04 12:35:50 · 555 阅读 · 3 评论 -
@RequestBody注解和@ResponseBody注解实现原理源码剖析+自定义消息转换器
@RequestBody:将请求中的参数json转换为对象@ResponseBody:将对象转换为json响应给浏览器@RequestBody和@ResponseBody的解析都发生在SpringMVC处理请求的第四步HandlerAdapter执行Handler逻辑并返回ModelAndView,此处只贴主要流程代码,全流程代码及处理请求的其他步骤请参考上篇文章:SpringMVC请求流程处理源码剖析第四部主要做了三件事情:遍历handler形参,根据不同形参类型以及是否存在@RequestBo原创 2021-01-25 02:09:07 · 3306 阅读 · 0 评论 -
SpringMVC初始化流程(事件监听机制、父子容器关系)
常用的SSM框架=Spring+SpringMVC(表现层)+Mybatis,其中Spring为父容器ApplicationContext、SpringMVC为子容器WebApplicationContext,Spring容器的初始化由ContextLoaderListener负责,SpringMVC的初始化由DispatcherServlet负责(web.xml中Listener优先于Servlet初始化)。下面将以问答模式叙述。1.springMVC初始化流程是什么?2.springMVC为什么要单原创 2021-01-24 21:17:38 · 888 阅读 · 0 评论 -
Spring和SpringMVC父子容器概念介绍转载
转载:转载 2021-01-24 16:08:29 · 192 阅读 · 0 评论 -
DispatcherServlet 配置/ 还是/*、DefaultServlet、JspServlet
DispatcherServlet 配置/ 还是/*、DefaultServlet、JspServlet感谢原创博主,讲解很清晰添加链接描述转载 2019-12-12 12:47:42 · 796 阅读 · 0 评论 -
2.一级缓存本质是什么?一级缓存什么时候被创建?一级缓存的工作流程?
MyBatis一级缓存问题:1.一级缓存到底是什么?2.一级缓存什么时候被创建?3.一级缓存的工作流程是怎样的?源码分析流程一级缓存到底是什么?解答由于一级缓存与SqlSession有关下面分析从SqlSession接口方法入手1.找到SqlSession中与缓存相关的方法-clearCache();2.进入SqlSessoin实现类DefaultSqlSession,发现实现clearCache()的代码是private final Executor executor;public原创 2020-12-13 17:04:03 · 326 阅读 · 0 评论 -
4.<cache>标签解析剖析
1.首先进入sqlSessionFactoryBuilder.build()方法public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { SqlSessionFactory var5; try { // 核心配置Configuration的XML解析 XMLConfigBuilder pars原创 2020-12-13 19:17:40 · 926 阅读 · 0 评论 -
5.二级缓存的工作流程是什么?
1.进入SqlSeesion的实现类DefaultSqlSession的selectList()方法public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) { List var5; try { MappedStatement ms = this.configuration.getMappedStatement(原创 2020-12-13 19:44:19 · 238 阅读 · 0 评论 -
6.二级缓存为何只有SqlSession关闭或者事务提交时才生效?
首先了解下这个设计的目的:注意二级缓存是从 MappedStatement 中获取的。由于 MappedStatement 存在于全局配置中,可以多个 CachingExecutor 获取到,这样就会出现线程安全问题。例如:会话一与会话二原本是两条隔离的事务,但由于二级缓存的存在导致彼此可见会发生脏读。若会话二的修改直接填充到二级缓存,会话一查询时缓存中存在即直接返回数据,此时会话二回滚会话一读到的数据就是脏数据。为了解决这一问题mybatis二级缓存机制就引入了事务管理器(暂存区),所有变动的数据原创 2020-12-13 20:46:15 · 933 阅读 · 3 评论 -
5.MyBatis插件的原理?源码剖析
Mybatis插件的加载原理1.MyBatis支持自定义插件,目的是能让开发者结合业务对框架进行增强,自定义的插件类必须实现org.apache.ibatis.plugin.Interceptor接口。切需要在核心XML配置文件中通过plugins显式声明,如:2.进入XMLConfigBuilder类的pluginElement()方法,这里式解析核心配置文件plugins标签的地方,根据源码得知这里解析plugin标签根据反射生成插件实现类并保存到configuration的interceptor原创 2020-12-13 23:46:23 · 218 阅读 · 0 评论 -
MyBatis总体流程
(1) 加载配置并初始化触发条件:加载配置文件配置来源于两个地方,一个是配置文件(主配置文件conf.xml,mapper文件*.xml),—个是java代码中的注解,将主配置文件内容解析封装到Configuration,将sql的配置信息加载成为一个mappedstatement对象,存储在内存之中(2) 接收调用请求触发条件:调用Mybatis提供的API传入参数:为SQL的ID和传入参数对象处理过程:将请求传递给下层的请求处理层进行处理。(3) 处理操作请求触发条件:API接口层传原创 2020-12-13 23:56:21 · 297 阅读 · 0 评论 -
MyBatis的Mapper代理原理
Mapper代理模式产生的原因:由于使用MyBatis框架时Mapper接口实现类中存在代码重复,整个操作过程模板重复(加载配置文件/创建SqlSessionFactory/生产SqlSession),故MyBatis推出了基于JDK动态代理自动生成代理Mapper接口实现类,代理类可以完成Mapper中定义的增删改查操作,避免代码重复工作。MapperRegistry加载原理在调用SqlSession.getMapper()方法时可以发现底层调用的是mapperRegistry.getMapper(原创 2020-12-14 01:26:29 · 585 阅读 · 0 评论 -
MyBatis延迟加载原理(源码剖析)
MyBatis延迟加载原理:它的原理是,使用 CGLIB 或 Javassist( 默认 ) 创建目标对象的代理对象。当调用代理对象的延迟加载属性的 getting 方法时,进入拦截器方法。比如调用 a.getB().getName() 方法,进入拦截器的invoke(…) 方法,发现 a.getB() 需要延迟加载时,那么就会单独发送事先保存好的查询关联 B 对象的 SQL ,把 B 查询上来,然后调用 a.setB(b) 方法,于是 a 对象 b 属性就有值了,接着完成a.getB().getNa原创 2020-12-14 03:10:03 · 1500 阅读 · 2 评论 -
advisor和aspect有什么区别,为什么在代理类生成之前会将全部的aspect和通用拦截器(MethodInterceptor)适配成advisor?
aspect是切面是由advice(通知=连接点JoinPoint+衡器逻辑)和切点(pointCut)组成一个切面可以有多个通知;advisor也是一种切面但是只包含一个通知;将aspect适配成advisor是为了方便SpringAOP创建代理类的时候进行横切逻辑执行的管理。可以里理解为aspect是面向开发者的一种切面,支持在一个类里创建多个通知方便使用,advisor是面向SpringAOP的一种切面把多个aspect按通知拆分出来方便管理。通用拦截器适配成advisor也是为了方便统一管理,通用拦原创 2021-01-02 20:26:34 · 1018 阅读 · 0 评论 -
Servlet、过滤器(Filter)、监听器(Listener)、拦截器(Interceptor)的作用和区别
1.Servlet:处理Request请求和Response响应2.过滤器(Filter):对Request请求起到过滤的作⽤,作⽤在Servlet之前,如果配置为/*可以对所有的资源访问(servlet、js/css静态资源等)进⾏过滤处理3.监听器(Listener):实现了javax.servlet.ServletContextListener 接⼝的服务器端组件,它随Web应⽤的启动⽽启动,只初始化⼀次,然后会⼀直运⾏监视,随Web应⽤的停⽌⽽销毁作⽤⼀:做⼀些初始化⼯作,web应⽤中spr原创 2021-01-10 21:26:34 · 1001 阅读 · 0 评论 -
SpringMVC请求流程处理源码剖析(我斑愿称你为最全)已完善最后总结
SpringMVC是一个应用于表现层的经典框架,其中M代表模型(数据模型[pojo/vo/po]+业务模型)主要作用是充当C——>V的数据传递介质,V代表view视图(jps、html)负责请求域中M的展示,C代表Controller控制器(Servlet)主要作用是接收请求调用业务层进行业务处理,并将处理结果转发到V或者直接响应给浏览器。 **SpringMVC请求处理流程较为宏观的描述**请求到达DispatcherServlet(前端控制器)后,DispatcherServlet调用Ha原创 2021-01-18 02:18:25 · 1118 阅读 · 7 评论 -
Spring声明式事务控制原理之声明式事务的重要组件在AOP中的应用
重要组件有:1.InfrastructureAdvisorAutoProxyCreator 后置处理器2.BeanFactoryTransactionAttributeSourceAdvisor 事务通知器3.TransactionAttributeSource 事务属性解析器4.TransactionInterceptor 事务拦截器,作为通知advice1. InfrastructureAdvisorAutoProxyCreator的作用InfrastructureAdvisorAutoPr原创 2021-01-03 02:26:32 · 576 阅读 · 0 评论 -
Spring声明式事务控制原理之声明式事务的重要组件(注解实现)以及之间关系
实现声明式事务只需要两个注解即可完成:@EnableTransactionManagement和@Transactional。下面就探究一下这两个注解究竟做了什么。@Transactional注解大家比较熟悉,作用在方法上用来显式声明事务,可以通过属性指定事务的隔离级别,传播行为,什么异常回滚什么异常不回滚等。主要还是探究一下@EnableTransactionManagement注解进入EnableTransactionManagement注解类发现首先这个类通过@Import帮Spring以注解解原创 2021-01-03 01:23:23 · 629 阅读 · 3 评论 -
SpringAOP之代理对象的执行(JDK动态代理为例)
当AOP增强后的代理Bean执行切入点方法时会进入JdkDynamicAopProxy的invoke方法1.首先看下切面类,当前有前置、后置、完成后置、异常四种通知。Spring解析时会解析为四个通知器(advisor)@Aspect@Componentpublic class MyAspect { @Pointcut(value = "execution(* *..service.*.*(..))") public void p1(){ } @Before(v原创 2021-01-02 02:49:15 · 1156 阅读 · 2 评论 -
SpringAOP之代理对象的创建
代理对象的创建是在Bean的后置处理器AbstractAutoProxyCreator的后置方法postProcessAfterInitialization中创建的。1.首先进入SpringBean创建主流程的最后一步,后置处理器的执行。AbstractAutowireCapableBeanFactory.classprotected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDe原创 2021-01-02 01:43:45 · 540 阅读 · 1 评论