spring源码
文章平均质量分 77
力求以最清晰的方式展示spring源码
JankeDeng
这个作者很懒,什么都没留下…
展开
-
老生谈spring(二十六):推断构造器初探
老生谈spring(二十六):推断构造器初探先看几个例子:1、当只有一个默认构造器时。@Componentpublic class C { public C(){ System.out.println("默认构造器"); }}这时没得选,只会反射这个默认的构造器。2、只有一个有参构造器。@Componentpublic class C { public C(A a){ System.out.println("有参构造函数" + a原创 2022-05-09 15:21:32 · 427 阅读 · 1 评论 -
老生谈spring(二十五):手动装配VS自动装配
老生谈spring(二十五):手动装配VS自动装配1、手动装配手动装配是可以进行value和ref进行配置,因为他已经明确了指定的属性值,这个称之为手动装配。手动装配分为:模式注解装配例子:其实就是使用@Component注解,或者@Component注解的拓展,比如@Controller、@Service、Repository、@Configruation等,这也是我们最常用的一种方式,直接通过spring mvc的注解把组件bean注入到spring容器中。@Enable模块装配例原创 2022-04-26 16:02:31 · 1435 阅读 · 0 评论 -
老生谈spring:自定义标签(番外)
资深小白谈spring(番外一):自定义标签原创 2022-01-21 22:05:41 · 371 阅读 · 0 评论 -
老生谈spring(二十四):Bean实例的创建(三)
老生谈spring(二十二):Bean实例的创建(三)1、这节我们来看看FactoryMethod有参数的情况,首先创建个B类,让spring管理。@Componentpublic class B {}2、然后在A类里使用构造方法注入B对象。public class A { private B b; public A(B b){ this.b = b; System.out.println("a init.."); }}3、a方法原创 2022-01-06 22:18:32 · 342 阅读 · 0 评论 -
老生谈spring(二十三):Bean实例的创建(二)
老生谈spring(二十二):Bean实例的创建(二)1、如果BeanDefiniton的factoryMethodName属性不为空,则进入instantiateUsingFactoryMethod的创建逻辑。 if (mbd.getFactoryMethodName() != null) { return instantiateUsingFactoryMethod(beanName, mbd, args); }2、点进instantiateUsingFactoryMethod方法你会原创 2021-12-30 22:09:41 · 367 阅读 · 0 评论 -
老生谈spring(二十二):Bean实例的创建(一)
老生谈spring(二十二):推断构造器原创 2021-12-26 17:10:13 · 260 阅读 · 0 评论 -
老生谈spring(二):初步了解ClassPathXmlApplicationContext
资深小白谈spring(二):初步了解ClassPathXmlApplicationContext1、在上一节中讲到启动容器的主要代码就是context.refresh();现在带大家认识这个refresh方法。2、点进这个方法你会发现,refresh是父类AbstractApplicationContext的方法,它采用了模板的设计模式,定义了一套spring容器启动时的抽象方法以及调用顺序。我们先不关心其他的,就只看obtainFreshBeanFactory方法。 @Override publ原创 2021-09-08 18:43:42 · 478 阅读 · 0 评论 -
老生谈spring(八):BeanDefinition的注册
资深小白谈spring(八):BeanDefinition的注册1、通过解析bean标签得到创建BeanDefinition的过程已经简单地讲完了,那么下面processBeanDefinition方法(DefaultBeanDefinitionDocumentReader类里)。创建玩Bean Definition并封装成BeanDefinitionHolder以后,就调用BeanDefinitionReaderUtils.registerBeanDefinition进行注册 protected vo原创 2021-09-13 17:20:36 · 466 阅读 · 0 评论 -
老生谈spring(十五):invokeBeanFactoryPostProcessors
资深小白谈spring(十五):invokeBeanFactoryPostProcessors1、上一节给大家展示了BeanFactoryPostProcessor的作用,现在给大家讲解它是如何生效的。前面几节已经带大家清楚地看到,开启了注解模式以后就会扫描指定包的所有含Component注解的class。所以只要加了Component的class都会被扫描器扫描到,扫描完了以后就会进入refresh的invokeBeanFactoryPostProcessors方法:2、invokeBeanFacto原创 2021-09-23 09:46:20 · 1047 阅读 · 0 评论 -
老生谈spring(十六):registerBeanPostProcessors
资深小白谈spring(十六):registerBeanPostProcessors1、registerBeanPostProcessors调用了PostProcessorRegistrationDelegate的registerBeanPostProcessors方法,该方法做的事情就三样:创建BeanPostProcessors、排序以及注册。public static void registerBeanPostProcessors( ConfigurableListableBeanFact原创 2021-09-24 09:03:24 · 295 阅读 · 0 评论 -
老生谈spring(二十):循环依赖(二)
资深小白谈spring(二十):循环依赖(二)1、首先看doGetBean的方法,进来对name进行一个解析,如果是别名转换成beanName。然后二话不说,调用getSingleton方法去拿这个实例。原创 2021-10-09 18:37:49 · 166 阅读 · 0 评论 -
老生谈spring(十四):BeanFactoryPostProcessor
资深小白谈spring(十四):invokeBeanFactoryPostProcessors序言:前面已经详细地讲解了obtainFreshBeanFactory方法,这个方法把xml文件解析为BeanDefinition然后逐个注册到beanDefinitionMap容器。接下来给大家讲解spring bean的创建过程,虽然这个过程非常长,也会分很多章节进行逐步讲解,但还是会尽量地把这个过程清晰完整地展示给大家。1、首先给大家理清一下spring启动的整个流程思路(refresh):1)obta原创 2021-09-18 12:23:24 · 422 阅读 · 1 评论 -
老生谈spring(十七):BeanDefinition的合并原理
资深小白谈spring(十七):preInstantiateSingletons序言:前面用了比较多的章节讲解了spring从创建容器、扫描得到BeanDefinitionMap、BeanFactoryPostProcessor的初始化及其方法的执行以及BeanPostProcessor的初始化和注册等等,接下来将进入spring framework的重中之重:IOC和AOP的源码讲解。本节开始将正式开始讲解spring bean创建的一系列生命周期,内容精彩不要错过哦。1、在finishBeanFac原创 2021-09-29 08:44:28 · 705 阅读 · 0 评论 -
老生谈spring(二十一):循环依赖(三)
资深小白谈spring(二十一):循环依赖(三)1、本节将解答上节留下的两个问题,首先看第一个问题为什么三级缓存要缓存一个Bean的工厂?要解答这个问题首先就要搞明白,spring注入的是Java对象还是一个spring bean(下面统称为bean)。有人可能没有弄明白这两个的关系,众所周知,bean就是一个Java对象,但是Java对象并不一定就是bean。举个最简单的例子,直接new一个对象,这个对象肯定是Java对象,但它不是spring创建的也不被spring管理,它也不具备bean的一些特性,原创 2021-10-11 17:23:56 · 167 阅读 · 0 评论 -
老生谈spring(六):xml的构造器注入原理
资深小白谈spring(六):xml的构造器注入1、我对第一节中的A类做一个小小的修改,在构造方法中注入一个name属性:public class A { private String name; /** * 构造注入 * * @param name */ A(String name) { this.name = name; } @Override public String toString(原创 2021-09-10 16:45:15 · 795 阅读 · 0 评论 -
老生谈spring(十):自定义标签之DefaultNamespaceHandlerResolver
资深小白谈spring(十):自定义标签之DefaultNamespaceHandlerResolver1、本节主要讲DefaultNamespaceHandlerResolver,首先看它的构造方法。它调用的是重载的构造方法,并且传了DEFAULT_HANDLER_MAPPINGS_LOCATION,DEFAULT_HANDLER_MAPPINGS_LOCATION就是项目路径META-INF下的spring.handlers文件。2、重载的构造方法只是做了简单的赋值,把spring.handler原创 2021-09-14 10:02:50 · 392 阅读 · 0 评论 -
老生谈spring(十九):循环依赖(一)
资深小白谈spring(十九):循环依赖(一)1、spring是否支持循环依赖,我们举个例子来证明一下。定义两个类A和B:@Componentpublic class A { @Autowired private B b;}@Componentpublic class B { @Autowired private A a;}...原创 2021-10-09 09:04:57 · 143 阅读 · 0 评论 -
老生谈spring(七):xml的setter注入原理
资深小白谈spring(七):xml的setter注入原理1、xml的setter注入和构造器的注入原理相似,先对xml和Aclass修改成setter注入public class A { private String name; public void setName(String name) { this.name = name; } @Override public String toString() { return "原创 2021-09-13 09:38:01 · 620 阅读 · 0 评论 -
老生谈spring(十二):ClassPathBeanDefinitionScanner的filter设置
资深小白谈spring(十二):ClassPathBeanDefinitionScanner的filter设置1、创建扫描器时如果没配置则使用默认的过滤器对扫描的类进行过滤2、createScanner值做了一件事就是new一个ClassPathBeanDefinitionScanner扫描器。3、ClassPathBeanDefinitionScanner的构造方法判断是否使用默认的过滤器,useDefaultFilters默认是true的。4、默认的过滤器中首先会有一个include过滤器去过原创 2021-09-16 09:08:59 · 366 阅读 · 0 评论 -
老生谈spring(十三):doScan的扫描原理
资深小白谈spring(资深小白谈spring(十三):doScan的扫描原理1、上一节讲了filter过滤器,这节带大家了解doScan的扫描原理:2、在doScan方法中,扫描的主要逻辑就在findCandidateComponents方法中,如果没有特殊配置,findCandidateComponents方法主要是调scanCandidateComponents方法进行扫描。3、遍历路径的代码只是个for循环就不看了,我们主要看的还是过滤器怎么进行过滤的。4、从代码就可以看到,使用match方原创 2021-09-17 18:35:30 · 874 阅读 · 0 评论 -
老生谈spring(四):xml的解析
资深小白谈spring(四):xml的解析1、接着上一节,我们继续看loadBeanDefinitions代码(代码被我简化成伪代码)public int loadBeanDefinitions(String location, @Nullable Set<Resource> actualResources) throws BeanDefinitionStoreException { ResourceLoader resourceLoader = getResourceLoader();原创 2021-09-08 18:50:41 · 428 阅读 · 0 评论 -
老生谈spring(三):初步了解Resource
资深小白谈spring(三):初步了解Resource1、接着看上一节的loadBeanDefinitions,这个方法的前几行都是构建beanDefinitionReader,最后一行则是调用loadBeanDefinitions进行xml的解析和注册,下面重点看这个方法。 @Override protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOExce原创 2021-09-08 18:47:00 · 265 阅读 · 0 评论 -
老生谈spring(十八):getBean
资深小白谈spring(十八):getBean1、preInstantiateSingletons这个方法会遍历beanNames时首先判断这个bean是不是FactoryBean,如果是则创建FactoryBean,否则直接getBean创建这个bean。这个方法在容器初始化的时候被调用,至于单例的非懒加载的bean才会被创建。2、getBean调用了doGetBean方法,看了这么久的spring代码,想必你已经指定带do的方法才是真正干活的。(doGetBean方法稍长,将拆分成几段)3、do原创 2021-09-29 11:29:05 · 254 阅读 · 0 评论 -
老生谈spring(五):parseBeanDefinitionElement对bean标签的处理
资深小白谈spring(五):processBeanDefinition对bean标签的处理1、上一节我们知道了bean标签的处理主要是通过processBeanDefinition方法,现在我们主要关注BeanDefinitionParserDelegate的parseBeanDefinitionElement方法,这个方法会让我们得到一个Bean Definition对象。protected void processBeanDefinition(Element ele, BeanDefinition原创 2021-09-09 09:31:45 · 389 阅读 · 0 评论 -
老生谈spring(一):spring的xml定义bean
spring源码精讲序言精者简也,这里我会用最简单、最通俗易懂的方式给大家讲解spring源码。如果你对spring源码非常感兴趣但又苦于spring源码的羞涩难懂,那么这些篇章就非常适合你。我会带大家以最清晰、最直观的方式阅读spring源码。初次以外,我还会带大家写一些自己的框架,然后通过spring的规范去整合这些框架以及功能。(我的spring版本是5.1.6.RELEASE)。spring官网:https://spring.io/资深小白谈spring(一):spring的xml定义bean原创 2021-09-08 18:45:03 · 576 阅读 · 0 评论 -
老生谈spring(九):自定义标签之初探
资深小白谈spring(九):自定义标签解析1、使用自定义标签,启动注解扫描得到class bean。注意在beans标签上需要引入context的uri,这个uri的作用在后面讲解。2、可以看到运行结果是正确的:3、想要了解context这种自定义标签的作用,首先看registerBeanDefinitions方法,这里会有个createReaderContext方法。4、这个createReaderContext会调用一个getNamespaceHandlerResolver的方法。5、原创 2021-09-14 09:12:34 · 189 阅读 · 0 评论 -
老生谈spring(十一):自定义标签之component-scan
资深小白谈spring(十一):自定义标签之component-scan1、上一节讲到了spring通过resolve方法解析spring.handlers文件得到context的解析类,现在接着来看resolve方法。反射得到这个handler类以后用BeanUtils创建这个类的实例,调用init方法后放到handlerMappings容器中。2、以context:component-scan为例,我们知道context的命名空间是由ContextNamespaceHandler来负责处理的,那么我原创 2021-09-15 09:08:15 · 316 阅读 · 0 评论