spring
ioc
以通过xml实例化spring的过程来分析:
核心方法入口 ClassPathXmlApplicationContext .refresh
-
bean容器初始化,初始化完成后会形成一个 beanName-> beanDefinition 的 map
(方法入口:ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
bean容器的初始化动作在ApplicationContext的实现类中)
* applicationContext持有一个实例化的DefaultListableBeanFactory容器类对象(容器对象实例化)
* 解析xml配置文件,把配置文件转换成一个个BeanDefinition,保存到map中 -
bean实例化(由beanFactory负责,spring启动时实例化所有的singleton 非lazy的bean
方法入口:finishBeanFactoryInitialization(beanFactory);beanFactory.getBean();doGetBean();createBean();doCreateBean())- 实例化bean :instanceWrapper = createBeanInstance(beanName, mbd, args);
- bean属性装配(三层缓存解决bean循环依赖问题):populateBean(beanName, mbd, instanceWrapper);
- bean初始化完成的回调:exposedObject = initializeBean(beanName, exposedObject, mbd);
实现了aware接口的回调:invokeAwareMethods(beanName, bean);
BeanPostProcessor 的 postProcessBeforeInitialization 回调:wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
InitializingBean 接口或init-method:invokeInitMethods(beanName, wrappedBean, mbd);
BeanPostProcessor 的 postProcessAfterInitialization 回调:wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
bean循环依赖的三层缓存
singletonFactories : 单例对象工厂的cache
earlySingletonObjects :提前暴光的单例对象的Cache(若有aop则返回的是代理类)
singletonObjects:单例对象的cache
aop
BeanPostProcessor后置处理器,
AbstractAutoProxyCreator 实现的 postProcessAfterInitialization() 方法,实现对bean的增强(动态代理)
spring mvc
方式一:web容器启动,实例化spring容器和spring mvc容器
web容器启动加载spring mvc
web容器启动时,
- 初始化Listener,执行contextinitialized
web.xml listener中配置spring 容器的初始化执行类,作为listener被web容器加载初始化,并放入servletContext。(父容器) - 初始化filter,执行init方法
- 初始化serlet,执行init方法
可以配置容器初始化时,就实例化配置的servlet,web.xml中配置spring mvc的dispatcherSerlet,加载spring mvc容器。(子容器,并设置父容器为spring容器)
spring mvc源码分析
前端控制器DispatchServlet
处理器映射器HandleMapping
处理器适配器HandleAdpter
视图解析器ModelAndView
方式二:spring boot内置web容器时,实例化spring容器,通过子类扩展启动web容器
spring boot内存web容器启动
5. 根据classpath下存在的类判断时应该加载那种applicationContext (spring mvc/webflux mvc/default)
6. 调用spring初始化的refresh方法,先初始化beanFactory容器(beanDefinition);在子类实现onfresh方法,onfresh方法中创建并启动web容器,根据spring facoties spi机制获取指定的web容器bean(tomcat/jetty/undertow等),初始化web容器(包含注入servlet3.0标准的内容listener/fliter/servelt,如spring mvc的dispatcherServlet),启动web容器
7. 继续实例化其他的spring bean
spring 事务管理
spring事务管理
// todo