spring源码
文章平均质量分 89
spring源码分析
youngerone123
这个作者很懒,什么都没留下…
展开
-
分布式事务实战八(Spring事务框架源码初探五)
经过前边几节的讲解,我们知道,@Transactional的核心其实就是BeanFactoryTransactionAttributeSourceAdvisor这个Advisor了。而这个BeanFactoryTransactionAttributeSourceAdvisor中有几个极为重要的方法,比如getPointcut()方法会返回切点信息,用于匹配判断一个bean在初始化过程中是否需要创建代理对象,再比如getAdvice方法会返回TransactionInterceptor拦截器,事务处理的核心逻原创 2022-04-13 20:08:28 · 333 阅读 · 0 评论 -
分布式事务实战八(Spring事务框架源码初探三)
上节我们分析了TransactionInterceptor增强的匹配过程,我们知道,其实在匹配的时候,和之前的AOP一样,也分为了类级别的方法级别的匹配。并且通过上节的分析,我们知道,在方法级别匹配的时候,判断方法级别是否匹配成功,依赖于是否获取到事务属性。这一节我们就来分析下,在方法级别匹配时,获取事务属性的过程。我们就接着上节,继续往下分析吧,那么分析的入口就是下边这行代码,如下图:可以看到,上图红框中的代码,就是上节分析方法级别匹配时,获取事务属性的代码了。我们就直接进去getTransacti原创 2022-04-12 20:24:27 · 318 阅读 · 0 评论 -
分布式事务实战八(Spring事务框架源码初探一)
通过上节的讲解,我们现在已经知道,基于AOP是可以实现与@Transactional注解相似的效果,其实@Transactional注解就是基于AOP来实现的呢?因为我们知道,从IOC容器获取bean的时候,是有可能获取到一个代理对象的,也就是说上边获取的flowRechargeCenterService这个bean可能就是一个代理对象,然后在这个代理对象中实现了开启事务、回滚事务和提交事务的逻辑。我们使用debug看一下,我们可以debug来看下flowRechargeCenterService这个bea原创 2022-04-11 21:17:09 · 207 阅读 · 0 评论 -
Spring AOP源码分析十三
当时我们找创建AOP代理的入口时,通过debug,发现了上边几个beanPostProcessor,然后我们通过名字,猜测AnnotationAwareAspectJAutoProxyCreator这个beanPostProcessor很有可能就是创建AOP代理的入口。那这个AnnotationAwareAspectJAutoProxyCreator也是Spring中的一个bean,那么这个bean在什么条件下才会注入进来?它的注入过程又是怎么样的呢?现在我们要来分析的是,创建AOP代理的入口,也就是Ann原创 2022-04-09 14:42:10 · 425 阅读 · 0 评论 -
Spring AOP源码分析十二
到目前为止,我们详细分析了jdk动态代理创建的整个流程,以及jdk动态代理执行的整个流程。我们知道,AOP代理其实分为jdk代理和cglib代理,接下来我们就要开始分析cglib代理,我们简单来回顾一下,我们看下边这张图:这里最重要的其实就是config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)这行代码了。首先config.isOptimize()表示是否开启了优化策略,原创 2022-04-09 09:13:44 · 343 阅读 · 0 评论 -
Spring AOP源码分析十一
上节我们分析了拦截器ExposeInvocationInterceptor和AspectJAfterThrowingAdvice的核心逻辑,我们现在知道,其实拦截器的核心逻辑,就是不断的递归调用ReflectiveMethodInvocation,而通过每个拦截器中的递归调用,就可以将这些拦截器连成一根链条。同时每个拦截器中还会实现自己的一些增强逻辑,比如ExposeInvocationInterceptor拦截器实现了同线程共用拦截器链的功能,而AspectJAfterThrowingAdvice拦截器在原创 2022-04-07 20:30:06 · 647 阅读 · 0 评论 -
Spring AOP源码分析十
上一节中,我们将getInterceptors()方法就分析完毕了,说白了就是将增强advisor转换为拦截器MethodInterceptor的流程。这个时候我们就要和之前分析的invoke()方法的流程串起来了,不知道大家还记不记得,那就是之前分析invoke()方法时,我们一共有两个地方的细节都给跳过去了,一个是获取拦截器链的过程,另外一个就是拦截器链的执行过程。在上一节的内容中,其实就是增强advisor转换为拦截器MethodInterceptor的过程,拦截器最终会被放入到拦截器链中,而拦截器链原创 2022-04-06 21:27:21 · 1242 阅读 · 0 评论 -
Spring AOP源码分析九
上一节我们主要讲了目标方法和增强的匹配过程,简单说就是首先在类级别进行匹配,接着在方法级别进行匹配,如果匹配成功的话,就通过registry.getInterceptors(advisor)这行代码获取advisor对应的拦截器,然后将这些拦截器放到一个集合中,这个集合其实就是拦截器链,最后将拦截器链作为结果进行返回。这个过程还是比较简单的,但是其中有一行代码我们跳了过去,那就是获取advisor对应的拦截器这个过程我们还不清楚,所以这节我们就专门来分析一下这个过程,说白了就是来分析下registry.ge原创 2022-04-05 11:02:30 · 666 阅读 · 0 评论 -
Spring AOP源码分析八
在上一篇文章的中,我们知道了invoke()方法的核心处理流程,其实就是先对特定方法进行处理,然后再获取目标方法的拦截器链,最后执行拦截器链并返回结果。但是具体是怎么获取目标方法对应拦截器链的?又是怎么执行拦截器链的?这些我们目前都不清楚,我们今天主要就是来分析一下拦截器链的获取过程,分析入口就是下边这行代码:通过上边的代码,我们可以看到,这个获取拦截器链的核心逻辑都封装在这个getInterceptorsAndDynamicInterceptionAdvice()方法中。那我们直接点进来看下,此时就会原创 2022-04-03 20:59:45 · 317 阅读 · 0 评论 -
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 · 903 阅读 · 0 评论 -
Spring AOP源码分析六
上篇文章我们详细分析了下代理工厂ProxyFactory,我们知道在ProxyFactory创建好之后,Spring会为ProxyFactory设置很多核心的属性,其中就包括非常核心的拦截器,这个拦截器包含我们切面中的增强拦截器和普通的拦截器。到这里为止,创建代理的准备工作就准备好了,那么本篇文章就接着往下分析,来看下Spring到底是怎么创建代理的。现在创建代理的准备工作都完成了,那么接下来就会来执行这行代码proxyFactory.getProxy(getProxyClassLoader()),如下图:原创 2022-04-01 21:30:42 · 577 阅读 · 0 评论 -
Spring AOP源码分析五
到目前为止,我们已经获取到了当前bean对应的拦截器(增强),接下来就是拿着这些拦截器来生成动态代理了,那么从这篇文章开始,我们就会一步一步来分析AOP创建代理的流程,分析入口当然是这个createProxy()方法方法了:那接下来,我们就直接到createProxy()方法中看下: protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specifi原创 2022-03-31 21:14:35 · 896 阅读 · 0 评论 -
Spring AOP源码分析四
上篇文章我们分析了切点表达式与目标类匹配的前半部分,也就是类级别的匹配,而这篇文章我们就来看最最核心的一块,那就是方法级别的精确匹配。在开始分析之前,我们先来猜测一下方法精确匹配,可能会从哪几个维度进行匹配,首先我们知道方法中比较重要的“属性”分别有方法参数、方法名字、方法返回值等信息,那么方法精确匹配是不是从这几个维度下手,进行的匹配呢?上篇文章我们分析到了这个地方,大家先来回顾一下,如下图:现在我们知道obtainPointcutExpression()方法返回的是一个PointcutExpress原创 2022-03-30 21:15:09 · 819 阅读 · 0 评论 -
Spring AOP源码分析三
上篇文章我们已经获取了切面类中自己声明的方法,我们接着之前的代码进行分析,我们继续分析Spring是如何获取增强方法上的AspectJ注解信息的并且如何对增强方法进行匹配的,我们回到之前我们分析的代码:现在这个getAdvisorMethods() 方法会返回before()、afterReturning()、getOrder()这三个方法。接着就是遍历依次处理这个三个方法,我们来看一下:这个行代码就是调用了getAdvisor() 方法,从切面类中获取的method传递进去。我们到这个getAdv原创 2022-03-29 21:41:56 · 924 阅读 · 0 评论 -
Spring AOP源码分析二
上一篇中,我们已经找到了AOP的源码入口,我们今天继续分析下面的源码,不过在此之前我们需要看下Spring中如何使用切面的。原创 2022-03-28 22:23:58 · 953 阅读 · 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 · 959 阅读 · 2 评论 -
Spring注解源码解析六
上一篇中,我们了解了@Autowire注解的底层原理,Spring会通过Bean的后处理器AutowiredAnnotationBeanPostProcessor,解析bean实例中的字段和方法上的注解@Autowired,最后会将对应的注解信息注入到属性或者方法参数上。今天我们看下另外的两个注解@PostConstruct和@PreDestroy。我们要分析注解@PostConstruct和注解@PreDestory的底层源码,我们得要先找到源码的入口在哪,那Spring到底是在什么时候解析这两个注解的原创 2022-03-25 10:11:39 · 789 阅读 · 0 评论 -
Spring注解源码解析五
上一节,我们已经了解了@Configuration注解如何与@Bean注解一起使用,本节中,我们将要了解Spring是如何通过@AutoWare注解为bean注入属性值的。要分析注解@Autowired的源码,同样的,我们还得要到注解@Autowired类中寻找源码入口的线索:在注解@Autowired类中发现AutowiredAnnotationBeanPostProcessor应该就是注解@Autowired的解析入口。那这个AutowiredAnnotationBeanPostProcessor是原创 2022-03-24 09:33:20 · 648 阅读 · 0 评论 -
Spring注解源码解析四
上一篇中,我们了解了注解@Configuration是如何结合注解@Bean使用了,而且我们也知道Spring在初始化时,会执行工厂后处理器ConfigurationClassPostProcessor中的方法,来处理注解@Configuration标准的注解配置类了。经过方法postProcessBeanDefinitionRegistry的分析,我们知道了Spring首先会过滤出这些添加了注解@Configuration的注解配置类,然后为注解配置类中的每个注解@Bean标准的方法,都创建一个BeanD原创 2022-03-23 15:41:14 · 558 阅读 · 0 评论 -
Spring注解源码解析三
上一节,我们已经分析了通过注解来配置bean,也就是通过@Coponent注解来配置bean,Spring容器启动时就会到指定的路径下扫描,如果发现某个类上标注了@Component注解,就会像扫描xml中的bean标签一样,将类中的信息封装为BeanDefinition并注册Spring容器中。接下来我们学习通过注解@Configuration和注解@Bean来配置bean。原创 2022-03-22 14:00:52 · 734 阅读 · 0 评论 -
Spring注解源码解析二
在前面的章节中,我们了解了注解的一些用法,并且模拟了Spring是如何通过注解来加载bean的,这一节我们就要开始深入到Spring源码,看下我们常用的注解是如何发挥作用的。我们先看下这个@Component是如何使用的,我们通过一个案例体验一下:我们新建一个user8 类,但是我们不需要将User8通过xml进行配置,而是在类上面新增了一个@Component注解。我们现在是分析的是注解相关的操作,所以我们这里采用的是Spring容器的类型是AnnoationConfigApplicationC原创 2022-03-21 22:50:40 · 576 阅读 · 0 评论 -
Spring注解源码解析一
我们们之前对Spring容器的初始化和bean的加载过程都做了相应的分析,不过我们之前分析源码入口是xml配置和BeanFactory,在我们的实际项目中,现在都不使用xml配置bean了。我们更多的是使用Spring提供的各种注解,比如@Bean、@Controller、@Component、@Service、@Autowired等注解。所以我们从本节开始就要对这些注解源码进行分析了。注解是什么呢?我们这里定义了一个名字叫做MyComponent的注解其实,注解本质就是一个接口,只不过是继承了An原创 2022-03-21 11:09:09 · 1798 阅读 · 3 评论 -
Spring源码解析二十七(bean的初始化)
前面我们已经了解了Spring如何为bean填充属性,而且,在属性填充时还涉及到三种自动装配模式,分别是根据名称、类型以及构造方法来自动装配bean的属性。完成bean属性装配之后,接下来就要开始bean的初始化了。原创 2022-03-20 22:49:21 · 701 阅读 · 0 评论 -
Spring源码解析二十六(bean如何填充属性)
我们之前初步分析Spring是如何实例bean的,Spring默认就是通过java反射来实例化bean的,我们只是看到了bean刚实例化出来,那Spring会对实例化好的bean做怎样的处理呢? 我们接着上一篇接着分析:我们已经通过方法createBeanInstance得到实例化好的bean实例了,并且bean实例被包装在instanceWrapper中。因为BeanDefinition中的postProcessor属性值默认为false,所以接下来会调用方法applyMergedBeanDefini原创 2022-03-19 12:59:47 · 1004 阅读 · 0 评论 -
Spring源码解析二十五(bean的实例化)
上一篇,我们了解了Spring 默认是如何实例化bean的,在实例化bean之前,Spring 还是做了很多的准备工作。我们最后找的了Spring 实例化bean的核心位置也就是doCreateBean。我们今天接着doCreateBean方法开始分析Spring是如何实例化bean的。我们到doCreateBean 方法中看下: protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object原创 2022-03-18 14:25:48 · 471 阅读 · 0 评论 -
Spring源码解析二十四
前面我们通过getBean的方法,分析了Spring是如何创建一个单例bean的,我们到现在为止只是看到了一些准备工作。比如检查是否存在prototype类型的bean正在创建,标记下当前的bean开始创建了,获取bean对应的BeanDefinition依赖提前初始化bean依赖的那些bean等。今天我们来分析下Spring的单例bean是如何创建的。我们找到bean的实例化入口:通过方法getSinleton获取单例bean的实例sharedInstance,然后进一步通过方法getObjectF原创 2022-03-17 10:05:50 · 528 阅读 · 0 评论 -
Spring源码解析二十三
上一篇,我们了解了Spring实例化bean的另外一种实例化bean的方式,也就是通过实现FactoryBean接口中的getObject方法,来自定义bean实例化的逻辑。这一篇,我们来看下Spring默认是如何来实例化bean的。在第一次调用getBean方法时,缓存中肯定是获取不到bean实例的,所以会走到上图的分支。可以看到,首先会调用方法isProptoTypeCurrentInCreation进行判断,我们到方法isProptoTypeCurrentInCreation中看下:可以看到,原创 2022-03-16 10:54:12 · 396 阅读 · 0 评论 -
Spring源码解析二十二
上一篇,我们分析了Spring是如果通过多级缓存来解决循环依赖的,其实思路还挺简单的,就是将还未完全创建好的bean先暴露在缓存中,这样的话,当其他的bean实例化需要依赖bean时,可以提前从缓存中获取还未实例化好的bean,从而解决循环依赖的问题。接下来我们继续接着doGetBean方法的主流程分析下后面的逻辑。如果一个单例bean实例化好了,或者在实例化过程中提前暴露在对象工厂缓存中了,我们可以通过方法getSingleton,从缓存中获取单例对象。我们假设我们可以从缓存中获取到单例bean,也就原创 2022-03-15 10:29:50 · 442 阅读 · 0 评论 -
Spring源码解析二十一(Spring如何通过三级缓存解决循环依赖)
我们之前已经研究了spring容器初始的主干线,接下来我们将要开始bean加载这条主线的研究。在bean加载的这条新的主线,我们会看到前面注册到spring容器中的BeanDefinition,是如何用来实例化bean的。我们看下我们之前写的一段获取bean的代码:可以看到这是之前我们分析ApplicationContext写的一段代码,其中bean的加载其实就是从getBean方法开始的,我们可以从getBean方法作为入口,开始分析spring 是如何加载bean的。我们先进到Applicatio原创 2022-03-13 17:14:24 · 839 阅读 · 0 评论 -
Spring源码解析二十
上一篇中,我们了解了spring中是如何基于事件驱动开发的,其实就是将监听器注册到事件广播器中,然后当spring发布事件时,事件广播器会遍历所有注册的监听器,并通过监听该事件的监听器来处理事件。这一篇中,我们继续将下面的方法:我们进到onRefresh方法中看下:可以看到方法onRefresh也是一个空方法,这个也是通过关键词protected修饰了,也就是说该方法onRefresh也是Spring留给子类的一个扩展方法。我们继续往下看:我们进到这个registerListener方法中看下:原创 2022-03-11 17:10:03 · 268 阅读 · 0 评论 -
Spring源码解析十九
上一篇,我们了解到了spring如果想要控制一个bean的实例化过程,可以通过自定义BeanPostProcessor来实现,当自定义的BeanPostProcessor注册到spring容器后,bean在实例化开始和结束后分别会调用BeanPostProcessor接口中的方法,从而实现介入bean的实例化过程,我们们才可以有机会控制bean的实例化。而且我们可以看到在Spring的高级容器ApplicationContext初始化时,也是将各种BeanPostProcessor注册到spring容器中,原创 2022-03-11 15:30:50 · 320 阅读 · 0 评论 -
Spring源码解析十八
上一篇,我们讲完了执行BeanFactoryPostProcessor后置处理器的执行过程,接下我们讲这个BeanPostProcessor注册。我们接着之前的代码:我们到方法registerBeanPostProcessor中看下:该方法又委托PostProcessorRegistrationDelegate中的registerBeanPostProcessors进行注册,不过在分析这个之前,我们先了解一下BeanPostProcessor是什么?BeanPostProcessor它就是在bean原创 2022-03-10 12:02:53 · 386 阅读 · 2 评论 -
Spring源码解析十七
上一篇,我们看到ApplicationContext对BeanFactory一些扩展的功能点,包括对SPEL语言的支持、添加属性编辑器的注册等。下面我们继续分析ApplicationContext对初级容器BeanFactory的一些其他的功能扩展点。我们接着之前的refresh方法接下分析。我们从方法postProcessBeanFactory开始分析,进入到方法postProcessBeanFactory中看下:可以看到方法postProcessBeanFactory是一个空实现,该方法也是被p原创 2022-03-10 10:32:25 · 268 阅读 · 1 评论 -
Spring源码解析十六
上一篇中,我们学习了ApplicationContext在初始化环节中对环境变量的一些初始化的工作,我们知道ApplicationContext也是创建了spring的初级容器BeanFactory。和我们之前一样是,ApplicationContext中的初级容器初始化也是委托给XmlBeanDefinitionReader完成的。接下来,我们再看下在ApplicationContext的初始化过程中,是如何对初级容器BeanFactory做一些功能拓展的。我们继续回到主流程refresh方法中:上原创 2022-03-08 22:15:37 · 282 阅读 · 0 评论 -
Spring源码解析十五
上一篇中,我们对容器ApplicationContext的初始化环节开始了初步的分析,我们已经找到了初始化的核心方法refresh。接下来我们看下refresh方法中做了哪些事情。我们回到refresh方法:可以看到,首先调用prepareRefresh方法,根据方法名我们可以知道是在为容器的初始化做一些准备工作。我们到prepareRefresh方法里面看下:可以看到,在prepareRefresh方法中大多数是一些初始化工作,比如设置容器的开始初始化的时间startupDate、设置容器状态原创 2022-03-07 11:13:14 · 490 阅读 · 0 评论 -
Spring源码解析十四
通过前面的学习,我们已经了解了spring的初级容器是如何初始化了,但是相比于陌生的XmlBeanFactory而言ApplicationContext显然大家更加的熟悉,在spring高级容器ApplicationContext中,包含了初级容器XmlBeanFactory中所有的东西 。ApplicationContext在初级容器的基础之上,扩展了非常多的高级特性,同时也给我们提供了非常多的功能扩展点,通过这些功能扩展点,我们可以将spring这个框架的功能改造的更加满足于我实际的业务场景。从这一篇开原创 2022-03-06 15:52:49 · 327 阅读 · 0 评论 -
Spring源码解析十三
上一篇,我们分析了bean标签下各种子标签的解析,最终都是将这些标签解析到的信息封装到BeanDefinition中。Spring得到这些BeanDefinition之后会做什么呢?肯定是要把这些BeanDefinition信息保存到Spring容器中的。所以Spring拿到这些BeanDefinition之后就要注册到Spring容器的。所以这一篇我们将要介绍BeanDefinition的信息时如何注册的Spring容器的。我们回顾一下我们上一篇中的内容:可以看到,当解析完成各种标签后直接就将Bea原创 2022-03-06 14:07:44 · 783 阅读 · 0 评论 -
Spring源码解析十二
上一篇中,我们了解到了Spring是如何解析bean标签上各种各样的属性,然后将解析到的属性值设置到BeanDefinition中。接下来我们要对bean标签的子标签进行进行分析:可以看到,bean标签的解析到现在就差这些字标签元素的解析了,我们先看到的是解析子标签meta、lookup-method和replaced-method标签。我们先来看meta子标签是如何解析的:解析的过程也比较简单,就是从bean标签下遍历获取meta标签,然后将解析到属性key和属性value的值封装到BeanMe原创 2022-03-05 16:41:59 · 373 阅读 · 0 评论 -
Spring源码解析十一
上一篇中,我们了解到Spring单独创建了GenericBeanDefinition对象来存储Bean标签解析出的属性值。在分析这个源码之前,我们有必要来了解下GenericBeanDefinition这个类。要了解GenericBeanDefinition 这个对象,我们还需要从BeanDefinition对象开始:可以看到,BeanDefinition 就是一个接口。我们之前讲过在Spring中,每个bean在Spring容器中都是以BeanDefinition的形式存的,而且BeanDefini原创 2022-03-05 11:47:31 · 280 阅读 · 0 评论 -
Spring源码解析十
Spring Bean标签的初步解析原创 2022-03-05 10:29:41 · 311 阅读 · 0 评论