
refresh()
君莫笑(๑˙ー˙๑)
欢迎互关,一起学习,共同进步
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spring5 源码阅读笔记(1)refresh() 刷新
入口private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");有了 applicationContet 之后,就可进行 getBean(beanName) 操作。与 ClassPathXmlApplicationContext 平行的还有:FileSy...原创 2020-02-16 20:59:36 · 467 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.1)obtainFreshBeanFactory() 获取新的 Bean 工厂
本节会揭晓:获得 Bean 工厂的大致步骤根据前面的文章,回顾一下 obtainFreshBeanFactory() 的来源:跟 ClassPathXmlApplicationContext 构造函数里的 refresh() 方法,refresh() 方法实现在其父类 AbstractApplicationContext 里,其中有一行:ConfigurableListableBean...原创 2020-02-16 20:59:23 · 535 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.1.1)parseDefaultElement(ele, delegate) 默认标签的解析和注册
本节会揭晓:默认标签解析流程根据前面的文章,我们知道了:在创建 Bean 工厂的过程里就会进行标签解析了。而标签解析分为两种:默认标签解析、自定义标签解析我们先看默认标签解析:类:DefaultBeanDefinitionDocumentReader重点看最重要的 bean 标签解析,跟 processBeanDefinition:里面有 2 步十分重要:解析 docume...原创 2020-02-17 12:12:39 · 323 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.1.2)delegate.parseCustomElement(ele) 自定义标签的解析和注册
前面的文章 Spring5 源码阅读笔记(1.1)obtainFreshBeanFactory() 末尾介绍到了默认标签解析和自定义标签解析。protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(roo...原创 2020-02-17 18:26:22 · 472 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.2) invokeBeanFactoryPostProcessors(beanFactory) 调用Bean工厂后置处理器
在 refresh() 方法里,invokeBeanFactoryPostProcessors(beanFactory) 是第二个非常重要的方法。从它的字面意思上看,它的作用是:调用 Bean 工厂的一些后置处理器。什么是 Bean 工厂后置处理器呢?顾名思义,在创建了 Bean 工厂后,可以对 Bean 工厂进行处理。接下来跟源码:类 AbstractApplicationContex...原创 2020-02-18 11:46:11 · 360 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.3)registerBeanPostProcessors(beanFactory) 注册Bean后置处理器
上一节 Spring5 源码阅读笔记(1.2) invokeBeanFactoryPostProcessors(beanFactory) 调用Bean工厂后置处理器 介绍了BeanFactoryPostProcessor,这一节介绍BeanPostProcessor。如果上一节理解清楚了,那么这一节就很容易理解了。因此,本小节篇幅较短。首先回顾一下 registerBeanPostProces...原创 2020-02-18 21:41:09 · 355 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.4)finishBeanFactoryInitialization(beanFactory) 完成Bean工厂初始化
源码里对这个方法的解释是:实例化所有剩下的(非懒加载的)单例 bean。为什么是剩下的?回忆一下前面的内容:invokeBeanFactoryPostProcessors(beanFactory) 里实例化了所有实现了BeanFactoryPostProcessor接口的Bean。registerBeanPostProcessors(beanFactory) 里实例化了所有实现了BeanPo...原创 2020-02-23 21:22:41 · 514 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.4.1)getSingleton(beanName) 从缓存里拿单例实例
在 doGetBean 方法里我们先尝试从缓存里拿实例:Object sharedInstance = getSingleton(beanName);跟源码:类 DefaultSingletonBeanRegistry跟 getSingleton:@Nullableprotected Object getSingleton(String beanName, boolean allo...原创 2020-02-19 21:16:00 · 736 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.4.2)createBean(beanName, mbd, args) 创建Bean
下面是 doGetBean 方法中的一段,在1.4节中讲到过:if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { // ...原创 2020-02-23 21:18:09 · 535 阅读 · 1 评论 -
Spring5 源码阅读笔记(1.4.2.1)createBeanInstance(beanName, mbd, args) 创建Bean实例
这个方法是 createBean(beanName, mbd, args) 里的第一个重要的方法,创建Bean实例。一个Bean要实例化是通过它的构造函数,而Bean的构造函数上可能有@Autowired注解。一个构造方法上有@Autowired,是想对引用类型的参数进行注入,这些参数会优先实例化。跟源码:类 AbstractAutowireCapableBeanFactoryprote...原创 2020-02-20 13:18:01 · 448 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.4.2.2)applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)
这是 doCreateBean 的第二个很重要的方法。第一个方法 createBeanInstance 通过构造函数创建了实例。如果构造函数上有 @Autowired,对入参先进行实例化。但如果类里还有其它属性上有 @Autowired,则还需要进行依赖注入。跟源码:类 AbstractAutowireCapableBeanFactoryprotected void applyMerg...原创 2020-02-21 09:49:00 · 609 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.4.2.3)addSingletonFactory(beanName, ()->getEarlyBeanReference(beanName, mbd, bean))
这个方法的入参里有一个匿名类的返回值。我们先看这个方法的代码:类 DefaultSingletonBeanRegistryprotected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {Assert.notNull(singletonFactory, "Singlet...原创 2020-02-23 01:02:28 · 4807 阅读 · 4 评论 -
Spring5 源码阅读笔记(1.4.2.4)populateBean(beanName, mbd, instanceWrapper) 填充Bean
回顾1.4.2 createBean(beanName, mbd, args)我们讲获取 Bean 实例的过程1.4.2.1 createBeanInstance(beanName, mbd, args)通过构造函数创建 Bean 实例。构造函数上如果有 @Autowired,会先将引用类型的入参对象优先实例化。但此时的 Bean 实例里的属性上、非构造方法上如果有 @Autowire...原创 2020-02-21 17:56:43 · 1148 阅读 · 2 评论 -
Spring5 源码阅读笔记(1.4.2.5)initializeBean(beanName, exposedObject, mbd)
先看一段代码,猜猜启动 Spring 后会打印什么:public class InitMethodBean implements InitializingBean{ @PostConstruct public void postConstruct() { System.out.println("======构造方法之后======="); } ...原创 2020-02-23 21:17:30 · 482 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.4.2.6)registerDisposableBeanIfNecessary(beanName, bean, mbd) 注册DisposableBean如有必要
本小节的作用可以说和 Spring5 源码阅读笔记(1.4.2.5)initializeBean(beanName, exposedObject, mbd) 是有关联的,那一节我们看到了三种初始化方法,这一节可以看到三种销毁方法。public class DestroyMethodBean implements DisposableBean { //jdk的注解 @PreDestr...原创 2020-02-27 10:16:37 · 865 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.4.3)getObjectForBeanInstance(sharedInstance, name, beanName, mbd) 获取Bean实例的对象
回顾if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { // Explicitly remove instance fr...原创 2020-02-24 16:22:48 · 401 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.4.4)多例的实例化
在此之前的文章都讲的是单例的实例化。本节讲的是多例的实例化。什么是多例?多例就是每次 getBean 操作得到的不是同一个对象。以下是 doGetBean 方法中的一段:else if (mbd.isPrototype()) { // It's a prototype -> create a new instance. Object prototypeInstance =...原创 2020-02-25 12:00:11 · 338 阅读 · 0 评论 -
Spring5 源码阅读笔记 (1.4)知识点汇总:解决循环依赖
什么是循环依赖?如下两段代码所示,Spring 在将 CircularRefA 实例化的时候需要注入 CircularRefB,因此会先实例化 CircularRefB。但实例化 CircularRefB 的时候又会发现需要先实例化 CircularRefA。实例化 CircularRefA 又得先实例化 CircularRefB …@Componentpublic class Circul...原创 2020-02-23 20:47:17 · 335 阅读 · 0 评论 -
Spring5 源码阅读笔记(1.5)finishRefresh() 完成刷新
protected void finishRefresh() { //清空上下文级别的资源缓存 clearResourceCaches(); //初始化上下文的LifecycleProcessor 见1.5.1 initLifecycleProcessor(); //调用所有LifeCycle的start方法 见1.5.2 getLifecycleProcessor().onRefresh(); //发布ContextRefreshedEvent publishEvent(new Co原创 2020-07-12 11:26:54 · 402 阅读 · 0 评论