自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

日有寸进

世上只有一种英雄主义,就是在认清生活真相之后依然热爱生活。

原创 Spring5 源码阅读笔记 (1.4)知识点汇总:解决循环依赖

什么是循环依赖? 如下两段代码所示,Spring 在将 CircularRefA 实例化的时候需要注入 CircularRefB,因此会先实例化 CircularRefB。但实例化 CircularRefB 的时候又会发现需要先实例化 CircularRefA。实例化 CircularRefA 又...

2020-02-23 20:47:17 102 0

原创 Spring5 源码阅读笔记(3.1)getAdvicesAndAdvisorsForBean 为Bean拿到增强与切面

主要流程 1 找到所有的候选切面 findCandidateAdvisors 1.1 获取所有的 BeanDefinition 的名称,进而获取所有的 Class 对象 1.2 将 Class 里有 @Aspect 注解信息的收集起来 1.3 根据有 @Aspect 注解信息的类获取切面 g...

2020-02-29 11:37:26 248 0

原创 Spring5 源码阅读笔记(3)AOP 入口:AbstractAutoProxyCreator

开启AOP最新方式 基于注解,不用xml @Component /* * 开启注解AOP * 替代了:<aop:aspectj-autoproxy/> * */ @EnableAspectJAutoProxy(proxyTargetClass = false,exposeProxy =...

2020-02-28 19:28:15 131 0

原创 Spring5 源码阅读笔记(2)AnnotationConfigApplicationContext 与 ConfigurationClassPostProcessor

在 Spring5 源码阅读笔记(1)refresh() 刷新 里,我们以 ClassPathXmlApplicationContext 的构造方法为入口找到了 refresh() 方法。 其实通过本小节的构造方法也可以: //构造1 public AnnotationConfigApplicat...

2020-02-27 18:19:08 77 0

原创 Spring5 源码阅读笔记(1.4.2.6)registerDisposableBeanIfNecessary(beanName, bean, mbd) 注册DisposableBean如有必要

本小节的作用可以说和 Spring5 源码阅读笔记(1.4.2.5)initializeBean(beanName, exposedObject, mbd) 是有关联的,那一节我们看到了三种初始化方法,这一节可以看到三种销毁方法。 public class DestroyMethodBean im...

2020-02-27 10:16:37 274 0

原创 Spring5 源码阅读笔记(1.4.4)多例的实例化

在此之前的文章都讲的是单例的实例化。本节讲的是多例的实例化。 什么是多例? 多例就是每次 getBean 操作得到的不是同一个对象。 以下是 doGetBean 方法中的一段: else if (mbd.isPrototype()) { // It's a prototype -&...

2020-02-25 12:00:11 78 0

原创 Spring5 源码阅读笔记(1.4.3)getObjectForBeanInstance(sharedInstance, name, beanName, mbd) 获取Bean实例的对象

回顾 if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { try { return createBean(beanName, mbd, args); } catch (Beans...

2020-02-24 16:22:48 82 0

原创 Spring5 源码阅读笔记(1.4)finishBeanFactoryInitialization(beanFactory) 完成Bean工厂初始化

源码里对这个方法的解释是:实例化所有剩下的(非懒加载的)单例 bean。 为什么是剩下的?回忆一下前面的内容: invokeBeanFactoryPostProcessors(beanFactory) 里实例化了所有实现了BeanFactoryPostProcessor接口的Bean。 regis...

2020-02-23 21:22:41 244 0

原创 Spring5 源码阅读笔记(1.4.2)createBean(beanName, mbd, args) 创建Bean

下面是 doGetBean 方法中的一段,在1.4节中讲到过: if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, () -> { try { return createBean(beanName, m...

2020-02-23 21:18:09 124 0

原创 Spring5 源码阅读笔记(1.4.2.5)initializeBean(beanName, exposedObject, mbd)

先看一段代码,猜猜启动 Spring 后会打印什么: public class InitMethodBean implements InitializingBean{ @PostConstruct public void postConstruct() { Sys...

2020-02-23 21:17:30 150 0

原创 Spring5 源码阅读笔记(1.4.2.3)addSingletonFactory(beanName, ()->getEarlyBeanReference(beanName, mbd, bean))

这个方法的入参里有一个匿名类的返回值。 我们先看这个方法的代码: 类 DefaultSingletonBeanRegistry protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonF...

2020-02-23 01:02:28 717 2

原创 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,会先将引用...

2020-02-21 17:56:43 438 0

原创 Spring5 源码阅读笔记(1.4.2.2)applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)

这是 doCreateBean 的第二个很重要的方法。 第一个方法 createBeanInstance 通过构造函数创建了实例。 如果构造函数上有 @Autowired,对入参先进行实例化。 但如果类里还有其它属性上有 @Autowired,则还需要进行依赖注入。 跟源码: 类 Abstract...

2020-02-21 09:49:00 246 0

原创 Spring5 源码阅读笔记(1.4.2.1)createBeanInstance(beanName, mbd, args) 创建Bean实例

这个方法是 createBean(beanName, mbd, args) 里的第一个重要的方法,创建Bean实例。 一个Bean要实例化是通过它的构造函数,而Bean的构造函数上可能有@Autowired注解。 一个构造方法上有@Autowired,是想对引用类型的参数进行注入,这些参数会优先实...

2020-02-20 13:18:01 80 0

原创 Spring5 源码阅读笔记(1.4.1)getSingleton(beanName) 从缓存里拿单例实例

在 doGetBean 方法里我们先尝试从缓存里拿实例: Object sharedInstance = getSingleton(beanName); 跟源码: 类 DefaultSingletonBeanRegistry 跟 getSingleton: @Nullable protecte...

2020-02-19 21:16:00 102 0

原创 Spring5 源码阅读笔记(1.3)registerBeanPostProcessors(beanFactory) 注册Bean后置处理器

上一节 Spring5 源码阅读笔记(1.2) invokeBeanFactoryPostProcessors(beanFactory) 调用Bean工厂后置处理器 介绍了BeanFactoryPostProcessor,这一节介绍BeanPostProcessor。 如果上一节理解清楚了,那么这...

2020-02-18 21:41:09 82 0

原创 Spring5 源码阅读笔记(1.2) invokeBeanFactoryPostProcessors(beanFactory) 调用Bean工厂后置处理器

在 refresh() 方法里,invokeBeanFactoryPostProcessors(beanFactory) 是第二个非常重要的方法。 从它的字面意思上看,它的作用是:调用 Bean 工厂的一些后置处理器。 什么是 Bean 工厂后置处理器呢? 顾名思义,在创建了 Bean 工厂后,可...

2020-02-18 11:46:11 101 0

原创 Spring5 源码阅读笔记(1.1.2)delegate.parseCustomElement(ele) 自定义标签的解析和注册

前面的文章 Spring5 源码阅读笔记(1.1)obtainFreshBeanFactory() 末尾介绍到了默认标签解析和自定义标签解析。 protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegat...

2020-02-17 18:26:22 112 0

原创 Spring5 源码阅读笔记(1.1.1)parseDefaultElement(ele, delegate) 默认标签的解析和注册

本节会揭晓: 默认标签解析流程 根据前面的文章,我们知道了: 在创建 Bean 工厂的过程里就会进行标签解析了。而标签解析分为两种:默认标签解析、自定义标签解析 我们先看默认标签解析: 类:DefaultBeanDefinitionDocumentReader 重点看最重要的 bean 标签解析...

2020-02-17 12:12:39 96 0

原创 BeanDefinition 属性一览

(1)id:bean的唯一标识名。它必须是合法的XMLID,在整个XML文档中唯一。 (2)name:用来为id创建一个或多个别名。它可以是任意的字母符合。多个别名之间用逗号或空格分开。 (3)class:用来定义类的全限定名(包名+类名)。只有子类Bean不用定义该属性。 (4)parent:子...

2020-02-17 11:26:05 291 0

原创 Spring5 源码阅读笔记(1)refresh() 刷新

入口 private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); 有了 applicationContet 之后,就可进行 getBean...

2020-02-16 20:59:36 208 0

原创 Spring5 源码阅读笔记(1.1)obtainFreshBeanFactory() 获取新的 Bean 工厂

本节会揭晓: 获得 Bean 工厂的大致步骤 根据前面的文章,回顾一下 obtainFreshBeanFactory() 的来源: 跟 ClassPathXmlApplicationContext 构造函数里的 refresh() 方法, refresh() 方法实现在其父类 AbstractA...

2020-02-16 20:59:23 181 0

提示
确定要删除当前文章?
取消 删除