spring源码

知识点:

singletonObjects,earlySingletonObjects,singletonFactories,beanDefinitionMap,mergedBeanDefinitions,BeanDefinition ,ConfigurableListableBeanFactory,BeanFactoryPostProcessor,BeanPostProcessor

Bean定义信息(xml,properties)->接口BeanDefinitionReader-> BeanDefinition ->反射-> 对象

spring bean -> scope -> signleton,prototype,request,sission

反射:Class aClass = stringBuilder.getClass();Constructor constructor = aClass.getConstructor();StringBuilder stringBuilder1 = constructor.newInstance();

BeanFactory:bean工厂,整个容器的根接口,也是容器的入口

PostProcessor->BeanFactoryPostProcessor(增强BeanDefinition),BeanPostProcessor(增强Bean)

创建对象->实例化(内存中开辟空间),初始化(填充属性,设置aware接口属性,BeanPostProcessor:before,初始化方法init-method,BeanPostProcessor:after)

不同阶段处理不同事情:观察者模式:监听器,监听事件,多播器

接口:BeanFactory,Aware,BeanDefinition,BeanDefinitionReader,BeanFactoryPostProcessor,BeanPostProcessor,Environment,FactoryBean

Environment:StandardEnviroment System.getEnv() System.getProperties();

FactoryBean:IsSingleton getObject getObjectType。beanFactory和factoryBean都是用来创建对象的。区别:当使用BeanFactory的时候必须要遵循,完整的创建过程,这个过程是由spring来管理控制的,而使用FactoryBean只需要调用getObject就可以返回具体的对象的,对象的创建过程是由用户自己来控制,更加灵活

prepare+invoke(

整体准备prepareRefresh,

BeanFactory-获取,准备,拓展,执行,

BeanPostProcessors-注册,初始化准备(国际化,事件多播器),拓展(onRefresh),注册监听,完成初始化(主要)

整体拓展-onRefresh

完成刷新

)

refresh:

/**

* 前戏,做容器刷新前的准备工作

* 1、设置容器的启动时间

* 2、设置活跃状态为true

* 3、设置关闭状态为false

* 4、获取Environment对象,并加载当前系统的属性值到Environment对象中

* 5、准备监听器和事件的集合对象,默认为空的集合

*/

1.prepareRefresh

// 创建容器对象:DefaultListableBeanFactory

// 加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition

2.obtainFreshBeanFactory(ConfigurableListableBeanFactory):ListableBeanFactory,ConfigurableBeanFactory

1.创建ConfigurableListableBeanFactory

2.loadBeanDefinitions加载配置文件(string -> resource ->document)->registerBeanDefinitions(BeanDefinitionMap,BeanDefinitionNames)

3.loadBeanDefinitions:此处获取xml文件的document对象,这个解析过程是由documentLoader完成的,从String[] -string-Resource[]- resource,最终开始将resource读取成一个document文档,根据文档的节点信息封装成一个个的BeanDefinition对象

4.自定义标签parseCustomElement:Parser,Handler,spring.handlers,spring.schemas,user.xsd

// beanFactory的准备工作,对各种属性进行填充

prepareBeanFactory(beanFactory);

1.通过一系列的add,set,ignore,register开头的方法,设置属性值

2.BeanFactory的准备工作:spel处理Resolver,解析Parser,配置Configuration

3.自定义属性编辑器:PropertyEditor,PropertyEditorRegistrar,xml中定义该bean。

4.添加beanPostProcessor,ApplicationContextAwareProcessor此类用来完成某些Aware对象的注入

Listener,LoadTimeWeaverAware

5.设置几个自动装配的特殊规则,当在进行ioc初始化的如果有多个实现,那么就使用指定的对象进行注入

// 子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码,是有具体实现的

postProcessBeanFactory(beanFactory);

1.自定义 extends ClassPathXmlApplicationContext,实现postProcessBeanFactory

// 调用各种beanFactory处理器

invokeBeanFactoryPostProcessors(beanFactory);

1.可以自由拓展,修改beanFactory中的相关信息,但使用最多的是对BeanDefinition的修改操作,

ConfigurationClassPostProcessor(Component/ComponentScan/Import/ImportResource/Bean),PropertySourcesPlaceholderConfigurer

2.implements BeanFactoryPostProcessor <bean class="com.mashibing.MyBeanFactoryPostProcessor"></bean>

3.BeanDefinitionRegistryPostProcessor(子),BeanFactoryPostProcessor(父)

顺序1:属于BeanDefinitionRegistry,不属于BeanDefinitionRegistry

顺序2:外部,子,父

顺序3: PriorityOrdered,Ordered,无顺序 -> 匹配,排序,添加,执行,清空

4.ConfigurationClassPostProcessor属于BeanDefinitionRegistry,BeanFactoryPostProcessor(父)和PriorityOrdered

5.@Configuration(Component/ComponentScan/Import/ImportResource/Bean)—>full 非@Configuration->lite

6.解析注解中的BeanDefinition,对应parser.parse方法

7.递归处理内部类processConfigurationClass

8.调用BeanFactoryPostProcessor的postProcessBeanFactory方法,动态代理,对配置类进行增强,解决@Bean的单例问题

// 注册bean处理器,这里只是注册功能,真正调用的是getBean方法

registerBeanPostProcessors(beanFactory);

1.//将 BeanPostProcessor 添加到beanFactory,它将应用于该工厂创建的Bean。在工厂配置期间调用

beanFactory.addBeanPostProcessor(postProcessor);

分类:priorityOrderedPostProcessors/orderedPostProcessors/nonOrderedPostProcessors/internalPostProcessors(spring内部的BeanPostProcessor:Autowire)

步骤-> 匹配,排序,添加

// 为上下文初始化message源,即不同语言的消息体,国际化处理,在springmvc的时候通过国际化的代码重点讲

initMessageSource();

1.注册DelegatingMessageSource,有自定义的使用自定义的messagesource,没有使用默认的

// 初始化事件监听多路广播器

initApplicationEventMulticaster();

1.观察者是被动触发。观察者/被观察者 spring:事件(被观察者的动作)/监听器(观察者)/多播器(遍历观察者通知消息)/事件源(被观察者,谁来执行发布具体的事件)

事件源发布-> 多播器广播-> 监听器根据具体事件执行

2.有自定义的使用自定义的多播器,没有使用默认的SimpleApplicationEventMulticaster。

3.多播器中有监听器集合

// 留给子类来初始化其他的bean

onRefresh();

1.在springmvc中会有对应的实现

// 在所有注册的bean中查找listener bean,注册到消息广播器中

registerListeners();

1.监听器添加到多播器

2.getBeanNamesForType,从容器中获取所有实现了ApplicationListener接口的监听器添加到多播器

// 初始化剩下的单实例(非懒加载的)

finishBeanFactoryInitialization(beanFactory);

1.为上下文初始化类型转换器 父接口:converter(一对一)/GenericConverter(一对多)/ConverterFactory(多对多)

2.嵌入值解析器

3.aop织入转换器

4.禁止使用临时类加载器,冻结所有的bean定义

5.getBean->doGetBean->createBean->doCreateBean (BPP,BFPP调用)

缓存:mergedBeanDefinitionHolders = new ConcurrentHashMap<>(256); 合并父类属性的

6.preInstantiateSingletons实例化剩下的单例对象

factoryBean的创建: getObjectFromFactoryBean->缓存中获取factoryBeanObjectCache->生成doGetObjectFromFactoryBean->后置处理postProcessObjectFromFactoryBean

普通:getBean:ObjectFactory是一个函数式接口,当调用其中的getBean方法时,才会将该逻辑执行

7.lookup-method:解决单例引用原型,cglib拦截器实现

createBeanInstance:FactoryBean -> supplier(回调方法)-> FactoryMethod -> BeanPostProcess(InstantiationAwareBeanPostProcessor) -> 反射(构造器)

8.instantiateUsingFactoryMethod,factoryBeanName为null,工厂方法是静态,不为null,工厂方法是非静态

9.autowireConstructor自动织入构造器,缓存,根据参数选择构造方法

10.createBeanInstance(实例化bean)返回BeanWrapper,是因为该包装类实现了转化及编辑接口,方便处理,

策略:Simple(有构造方法,无构造方法,factoryMethod),Cglib(有构造方法,无构造方法)

11.注解的识别解析,只注册,不执行 applyMergedBeanDefinitionPostProcessors,postProcessMergedBeanDefinition:

CommonAnnotationBeanPostProcessor(处理@PostConstruct和@PreDestroy注解,@Resource)

AutowiredAnnotationBeanPostProcessor(处理@Autowired,@Value)

12.初始化和循环依赖

对象需要被代理,拿代理对象覆盖普通对象

成品,半成品,代理对象(lambda表达式,放成品时清除,创建:1.属性注入时检查发现需要被代理,直接生成 2.bpp的after中生成无引用的)

查找顺序1-2-3,二级缓存是解决循环依赖,三级缓存解决代理问题

13.populateBean:自定义+xml(autowire)+注解+xml(property)

1.调用postProcessAfterInstantiation方法来完成属性的赋值操作,可以直接终止后续值处理工作。自定义实现拓展

2.根据配置文件的autowire属性,决定使用名称注入还是类型注入autowireByName,autowireByType->pvs(PropertyValues)

3.@Autowired注解 postProcessProperties -> AutowiredAnnotationBeanPostProcessor

4.根据property标签定义的属性值,完成解析和赋值。applyPropertyValues。递归处理resolveValueIfNecessary

14.initializeBean:

执行Aware接口对应的方法:BeanNameAware、BeanClassLoaderAware、beanFactoryAware

执行before的初始化方法:ApplicationContextAwareProcessor,CommonAnnotationBeanPostProcessor(解析@Resource)->InitDestroyAnnotationBeanPostProcessor:处理@PostConstruct和@PreDestroy注解,@Resource

执行init-method:1.实现了InitializingBean的接口后执行afterPropertiesSet,自定义2.调用自定义init-method方法

执行after的初始化方法:AbstractAutoProxyCreator->AOP

15.doCreateBean(createBeanInstance,populateBean,initializeBean)

16.先合并父类属性,优先get,获取不到在create,反射的方式创建,解析autowired等,放入三级缓存,populateBean,

17.aop:CglibAopProxy 获取拦截器链 List<?> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);

18.populateBean:解析@Autowired,@value。

initializeBean:处理@PostConstruct和@PreDestroy注解,init-method,AOP

// 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人

finishRefresh();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值