Spring
文章平均质量分 96
jchen104
芝兰生于幽谷,不以无人而不芳
展开
-
Spring源码:动态代理的增强顺序(AOP与事务的先后)
在之前的文章中,我们介绍了AOP与Spring事务的内容(事务管理也是通过AOP的动态代理实现的),包括代理的创建、执行等,但是遗留了一个问题,那就是多个增强的执行顺序是怎样的,本文我们就来进行下梳理。AOP在被设置在了后置处理器中,每个bean创建完后会判断是否需要创建代理类,如果需要则获取所有的通知方法(包括继承了Advisor接口的实现类与@Aspect标注的切面类中的增强方法,包装为Advisor类)并放入缓存中以便下次代理,然后筛选出适用于当前bean的增强并封装为代理对象。原创 2023-04-30 17:37:54 · 1538 阅读 · 2 评论 -
Spring事务源码:事务的提交与回滚
在前文中,我们介绍了事务的创建,事务创建好后就可以执行被代理方法了,执行完后我们还需要根据其执行结果判断是提交还是回滚,本文我们就来深入讲解下这两个操作。// 声明式事务处理// 创建事务,事务属性等信息会被保存进TransactionInfo中try {// 执行目标方法// 异常处理throw ex;finally {// 清空事务信息// 提交事务目录前言一、事务回滚2、rollback二、事务提交2、commit4、doCommit三、清除事务信息。原创 2023-04-06 09:08:35 · 1557 阅读 · 0 评论 -
Spring事务源码:事务创建
在前文中我们介绍了Spring事务管理是如何开启以及创建代理类对象的,本文我们来深入解析下代理类是如何实现事务的管控。目录前言一、代理类中方法执行二、事务管理三、开启事务1、获取当前事务2、获取事务对象3、判断是否存在事务4、挂起事务5、开启新事务6、绑定线程与数据库连接7、创建默认status8、存在原事务时的处理方案。原创 2023-04-04 09:16:22 · 828 阅读 · 0 评论 -
Spring事务源码:创建代理类
本文我们介绍下Spring中的事务管理的源码,Spring的事务管理主要有申明式事务与编程式事务这两种,如果对这两种方式不了解的朋友可以先看下这篇文章(《Spring事务管理(详解+实例)》)然后再来深入源码分析。我们通过如下方式开启事务,由于申明式事务的注入方式式基于代理方式实现的,因此这里也建议先了解下AOP的源码,这部分我前文已经做了完整的介绍,因此下文将不会对AOP的功能做深入的解析,有需要的朋友可以看下我之前AOP的文章。目录前言。原创 2023-04-01 17:17:20 · 771 阅读 · 0 评论 -
SpringMVC源码:视图解析与异常处理
抽象类AbstractView执行对数据进行组装,输出操作交由子类完成@Override// 组装数据// 渲染输出AbstractHandlerExceptionResolver对接口进行了一个抽象,实现其中的通用逻辑,并暴露对应的doResolveException方法交由子类实现。@Override//先判断该异常处理类是否支持处理handler执行过程中产生的异常//设置response禁用缓存 使用preventResponseCaching(默认是false不禁用缓存)原创 2023-03-12 12:09:09 · 642 阅读 · 0 评论 -
SpringMVC源码:视图解析器
过程和HandlerMapping的初始化很类似,一样是解析容器中的ViewResolver类型的Bean。if (!else {try {该方法可以对解析过的视图对象进行缓存,下面我们看下其实现原理@Override@Override// 默认1024@Override//判断是否对解析出来的View对象(视图对象) 进行缓存//判断逻辑是其cacheLimit(允许缓存的视图对象个数)默认是1024 默认是走缓存 可以更改为不走缓存if (!//创建View。原创 2023-03-09 08:57:27 · 917 阅读 · 0 评论 -
SpringMVC源码:参数解析、方法调用与返回值处理
这里以AbstractHandlerMethodAdapter类为例,可以看到内部实际上是调用了handleInternal方法,而这个方法实际上是由子类RequestMappingHandlerAdapter实现的。(注意下这里的返回值为ModelAndView)@Override。原创 2023-03-06 14:15:00 · 867 阅读 · 0 评论 -
SpringMVC源码:getHandler、getHandlerAdapter过程
这里的主要作用是根据请求获取包装了Handler对象和拦截器的HandlerExecutionChain对象。该方法采用模板方法获取拦截器处理器链。@Override//交由子类实现的根据请求获取处理器的具体逻辑 不同的子类获取Handler的逻辑不同//如果没有获取到Handler 则获取默认的Handler//默认的处理器可以通过配置映射器实例的时候通过属性设置//如果默认的Handler还是没有则返回空//Handler处理器是字符串类型 说明获取的Handler是beanName。原创 2023-03-04 14:17:22 · 707 阅读 · 0 评论 -
SpringMVC源码:HandlerMapping加载2
但是在我们的日常开发中,handler大部分是一个使用@RequestParam修饰的一个方法,比如这样。原创 2023-03-02 10:06:54 · 385 阅读 · 0 评论 -
SpringMVC源码:HandlerMapping加载1
AbstractHandlerMapping是HandlerMapping的抽象实现,同时实现了Order接口继承了WebApplicationObjectSupport类,order接口主要是为了如果spring容器中有多个HandlerMapping,则按照order 排序去一次使用HandlerMapping获取handler对象,order小的优先被使用。原创 2023-02-28 08:56:47 · 419 阅读 · 0 评论 -
SpringMVC源码:DispatcherServlet初始化流程
MVC结构我们都知道,将模型、视图与控制器拆分实现分层。SrpingMVC采用类似的结构。不同的地方在于,SpringMVC的控制器多了一个,即前端控制器。前端控制器的作用在于将不同的请求根据地址转给不同的控制器进行处理,并对返回的模型选择相应的视图进行渲染。原创 2023-02-26 11:13:40 · 978 阅读 · 0 评论 -
Spring AOP源码3:实现代理
findAdvisorsThatCanApply// AbstractAdvisorAutoProxyCreator.javaprotected List<Advisor> findAdvisorsThatCanApply( List<Advisor> candidateAdvisors, Class<?> beanClass, String beanName) { ProxyCreationContext.setCurrentProxiedBean...原创 2022-05-30 08:30:00 · 624 阅读 · 0 评论 -
Spring AOP源码2:查找增强器
前文:《Spring AOP源码:开启注解读取》写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。 在前文中,我们注册了代理类的自动创建类AnnotationAwareAspectJAutoProxyCreator,该类继承了BeanPostProcessor 接口,在AbstractAutoProxyCreator类中重写了postProcessAfterInitialization方法,进而实现了对正在创建中的bean实例的代理。...原创 2022-05-21 09:00:00 · 547 阅读 · 0 评论 -
Spring AOP源码:开启注解读取
写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。目录一、AOP功能的开启二、AOP解析器的注册 2.1、registerAspectJAnnotationAutoProxyCreatorIfNecessary2.1.1、registerOrEscalateApcAsRequired2.1.2、useClassProxyingIfNecessary2.1.3、registerCompo...原创 2022-05-20 08:30:00 · 533 阅读 · 0 评论 -
Spring IOC:bean的生命周期与@Autowire(3)
写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。前文中我们走完了bean的实例化与属性注入的流程,本文中我们继续走完后续的流程。一、AbstractAutowireCapableBeanFactory#initializeBeandoCreateBean的最后一步,bean的初始化流程,调用initializeBean方法完成。protected Object doCreateBean(final String b...原创 2022-05-04 08:30:00 · 650 阅读 · 0 评论 -
Spring IOC:bean的生命周期与@Autowire(2)
参考资料:《Spring IoC源码学习:@Autowire 详解》全系列文章:《Spring:bean的生命周期与@Autowire(1)》写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。 前文中我们走完了createBeanInstance的流程,完成了bean的实例化,本文中我们继续走完后续的流程。一、AbstractAutowireCapableBeanFactory#applyMergedBeanDef...原创 2022-05-02 08:30:00 · 763 阅读 · 0 评论 -
Spring IOC:bean的生命周期与@Autowire(1)
写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。Spring在整个生命周期中提供了非常多的扩展节点,这使得我们可以有非常多的方式来对bean的创建过程进行自定义的调整。下面我们结合bean的创建过程,对其生命周期进行一遍整理。一、BeanFactoryPostProcessor#postProcessBeanFactory 在应用上下文刷新过程中,即AbstractApplicationContext#refresh的过程中,...原创 2022-05-01 17:29:02 · 1061 阅读 · 0 评论 -
Spring:如何解决单例bean中的属性循环依赖
参考资料:《Spring如何解决循环依赖问题》《Spring 系列教程之 bean 的加载》写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。原创 2022-04-05 08:30:00 · 1084 阅读 · 1 评论 -
Spring IoC源码学习:createBean调用链(1)
参考资料:《Spring IoC源码学习:createBean 详解(上)》前文:《Spring IOC:getBean调用链》写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。一、createBean 1、createBean (1)resolveBeanClass通过mbd与beanName解析得到类的全路径,验证及准备覆盖的方法(对override属性进行标记及验证)。(2)实例化前,给Insta...原创 2022-02-24 08:00:00 · 414 阅读 · 0 评论 -
Spring IOC:getBean调用链
参考资料:《Spring IoC源码学习:getBean 详解》前文:《Spring IOC:finishBeanFactoryInitialization调用链》写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。一、getBean 1、getBean 跳转至doGetBean方法(观察Srping的命名习惯,方法名使用do开头的方法是最终进行实际操作的方法)。// AbstractBeanFactory.java...原创 2022-02-17 14:00:00 · 347 阅读 · 0 评论 -
Spring IOC:finishBeanFactoryInitialization调用链
参考资料:《Spring IoC源码学习:finishBeanFactoryInitialization 详解》写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。目录一、概述1、finishBeanFactoryInitialization 2、核心概念 (1)、MergedBeanDefinition (2)、FactoryBean 3、finishBeanFact...原创 2022-02-04 15:15:00 · 536 阅读 · 0 评论 -
Spring IOC:registerBeanPostProcessors调用链
参考资料:《Spring IoC源码学习:registerBeanPostProcessors 详解》写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。一、概述二、registerBeanPostProcessors1、AbstractApplicationContext#registerBeanPostProcessors 简单的跳转,转入PostProcessorRegistrationDelegate类的regi...原创 2022-01-30 14:00:00 · 763 阅读 · 0 评论 -
Spring IOC:invokeBeanFactoryPostProcessors调用链
二、invokeBeanFactoryPostProcessors 1、区分BeanDefinitionRegistryPostProcessor与BeanFactoryPostProcessor Set<String> processedBeans = new HashSet<String>(); // 判断beanFactory是否为BeanDefinitionRegistry,beanFactory为DefaultListable...原创 2022-01-27 14:00:00 · 501 阅读 · 0 评论 -
Spring IOC:ComponentScanBeanDefinitionParser调用链
参考资料:《Spring IoC源码学习:context:component-scan 节点详解》前文:《Spring IOC:parseCustomElement调用链》写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。一、parse 在前文中,我们了解到当 element 为 <context:component-scan /> 节点时,findParserForElement(element, parserContex...原创 2022-01-26 14:00:00 · 576 阅读 · 0 评论 -
Spring IOC:parseCustomElement调用链
这一步其实内容较少,主要是针对spring配置文件中的自定义命名空间节点,读取spring.handlers文件加载命名空间与解析器的映射关系,再针对当前节点确认其解析器,为下一步操作做准备。(注意,这里叫自定义命名空间节点,是因为我们不仅可以处理spring自定义的节点,还可以配置我们自己个性化的命名空间节点,有兴趣的可以看这篇文章的最后部分《传送门》原创 2022-01-20 14:00:00 · 370 阅读 · 0 评论 -
Spring IOC:parseDefaultElement调用链
1、对于传入parseDefaultElement方法的节点调用parseBeanDefinitionElement方法创建AbstractBeanDefinition对象beanDefinition,并将该节点的各类信息解析、存入beanDefinition对象中。2、将beanDefinition、beanName、aliasesArray构建成 BeanDefinitionHolder对象并返回,为后续注册做准备。原创 2022-01-17 20:34:09 · 285 阅读 · 0 评论 -
Spring IOC:obtainFreshBeanFactory调用链
obtainFreshBeanFactory 方法会解析所有 Spring 配置文件(即我们在前文中介绍的contextConfigLocation配置),将所有 Spring 配置文件中的 bean 定义封装成 BeanDefinition,加载到 BeanFactory 中。原创 2022-01-15 16:23:42 · 397 阅读 · 0 评论 -
Spring IOC:从ContextLoaderListener到AbstractApplicationContext
例如下面的 SpringApplicationContextInitializer,可以在 initialize 方法中进行自己的逻辑操作,例如:添加监听器、添加 BeanFactoryPostProcessor。原创 2022-01-11 22:29:09 · 474 阅读 · 1 评论