知识点:
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();