在java体系中,spring是一个非常出名的框架。它包含了很多东西,但是IOC容器是它的基本功能,这个不可不知。
在spring中,主要有三种方式加载容器:
1.使用类路径加载配置文件
ClassPathXmlApplicationContext("bean.xml")
2.使用文件系统加载配置文件
FileSystemXmlApplicationContext("/opt/bean.xml")
3.使用注解方式加载
AnnotationConfigApplicationContext(SpringConfig.class);
在实际的使用中,随着spring-boot的流行,注解方式使用的越来越普遍。
AnnotationConfigApplicationContext(SpringConfig.class);
代码断点跟进去
第一步: this()
创建给bean definition的解析器,其中里面会添加一个ConfigurationClassPostProcessor.class 后置处理器来加载系统配置.
第二步:register(annotatedClasses); 将该类注册到容器中
1).需要判断该类是否有Primary.class,Lazy.class注解修饰
2).添加bean的别名
第三步:refresh(); 创建容器
1).prepareRefresh();刷新前的预处理
①.initPropertySources();留给子类来初始化一些环境属性变量
②.getEnvironment().validateRequiredProperties(); 验证环境属性变量
③.this.earlyApplicationEvents = new LinkedHashSet
创建早期的事件集合
2). obtainFreshBeanFactory() 获取bean工厂
①.refreshBeanFactory(); 刷新bean工厂,添加序列化id
②.getBeanFactory() 获取bean工厂 new了一个 DefaultListableBeanFactory();
3)prepareBeanFactory(beanFactory); 在beanFactory中预初始化一些值
①.设置bean的类加载器
②.设置bean表达式的解析器
③.设置系统预定义的后置处理器,,比如ApplicationContextAwareProcessor
④.忽略一些自动装配的接口,比如EnvironmentAware,EmbeddedValueResolverAware
⑤.注册一些可解析的依赖类,BeanFactory,ResourceLoader,ApplicationEventPublisher....
⑥.添加事件的侦测器ApplicationListenerDetector
⑦.侦测是否有织入,有的话还要添加LoadTimeWeaverAwareProcessor 后置处理器
⑧.注册默认的系统环境bean environment,systemProperties,systemEnvironment
4).postProcessBeanFactory(beanFactory);
在子类中重写该方法,可以自定义添加一些bean 的后置处理器,修改spring 容器上下文
5)invokeBeanFactoryPostProcessors(beanFactory); 调用bean工厂的后置处理器
①.加载BeanFactoryPostProcessor
1.找到实现了PriorityOrdered接口的后置处理器,排序,调用
2.找到实现了Ordered接口的后置处理器,排序,调用
3.找到没有实现上两个接口的后置处理器,调用
②.加载BeanDefinitionRegistryPostProcessor
1.找到实现了PriorityOrdered接口的后置处理器,排序,调用
2.找到实现了Ordered接口的后置处理器,排序,调用
3.找到没有实现上两个接口的后置处理器,调用
③.调用余下beafactoryPostProcessor(后置处理器)
6).registerBeanPostProcessors注册bean的后置处理器
①.找到实现了PriorityOrdered接口的后置处理器,排序,注册
②.找到实现了Ordered接口的后置处理器,排序,注册
③.找到常规后置处理器排序,注册
④.注册一些系统内部的后置处理器 (实现了MergedBeanDefinitionPostProcessor接口)
⑤.重新注册一下事件侦测器,将未添加的事件加入到容器中
7).initMessageSource(); 资源国际化
8).initApplicationEventMulticaster()初始容器的多播器
如果不存在就添加一个SimpleApplicationEventMulticaster
9).onRefresh(); 子类实现该接口可以刷新容器
10).registerListeners(); 检查事件并注册他们
11).finishBeanFactoryInitialization(beanFactory);实例化所有的单实例bean
主要来看beanFactory.preInstantiateSingletons();方法
①.获取系统中定义的bean
②.判断是否不是虚类,是单例,不是懒加载
③.判断是否是工厂bean
④.获取bean(getBean)--> doGetBean
1.从缓存中获取bean,bean创建成功后,都会放到缓存中,也就是一个Map,singletonObjects
2.主要讲一下单实例bean的创建 createBean(beanName, mbd, args)-->doCreateBean
<1>.createBeanInstance 实例化这个bean,此时该bean只是刚刚创建出来,只是有个地址引用。
<2>.populateBean(beanName, mbd, instanceWrapper); 给bean复制
<3>.initializeBean(beanName, exposedObject, mbd) 实例化bean
【1】.invokeAwareMethods 调用aware方法,
BeanNameAware,
BeanClassLoaderAware,
BeanFactoryAware
【2】.applyBeanPostProcessorsBeforeInitialization 调用bean的前置处理器
【3】.invokeInitMethods 调用实例方法
【4】.applyBeanPostProcessorsAfterInitialization 调用后置处理器
<4>bean 创建完成之后需要添加到缓存中
⑤.如果bean是SmartInitializingSingleton类型,还需要执行afterSingletonsInstantiated方法
12).finishRefresh();完成刷新方法
①.initLifecycleProcessor(); 初始化生命周期的处理器
如果没有默认创建一个DefaultLifecycleProcessor
②.getLifecycleProcessor().onRefresh(); 执行生命周期处理器的onRefresh()方法
③.publishEvent(new ContextRefreshedEvent(this)); 发布容器刷新完成事件
④.LiveBeansView.registerApplicationContext(this); 添加MBean
1.创建beanfactory
2.添加beanPostProcessor(后置处理器)
3.实例化bean
4.添加监听器
1.版本说明
spring 4.3.12.RELEASE