spring源码分析之初始化过程
1.org.springframework.web.context.ContextLoaderListener 一个ServletContextListener,web容器启动监听器
1.1内有成员ContextLoader,当contextInitialized时,调用this.contextLoader.initWebApplicationContext(event.getServletContext());
2.org.springframework.web.context.ContextLoader.createWebApplicationContext(ServletContext, ApplicationContext) 创建ApplicationContext
在此方法中调用org.springframework.context.support.AbstractApplicationContext.refresh()
3.在refresh方法里面org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(),创建BeanFactory对象,具体方法在org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory()
4.创建BeanFactory之后加载BeanDefinitions org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(DefaultListableBeanFactory)
注意,beanfactory同时也是BeanDefinitionRegistry,在读取到bean后调用org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(String, BeanDefinition)将bean定义放到beanDefinitionMap缓存,
ApplicationContext同时也是resourceloader,org.springframework.context.support.GenericApplicationContext.getResources(String)读取资源
5. fresh后面,当beanfactory初始化完之后,调用org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(ConfigurableListableBeanFactory)单例bean的实例化过程,单例bean实例保存在singletonObjects中。
6.获取bean,如果没有就创建org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(String, Class<T>, Object[], boolean),如果是工厂bean,先创建工厂bean,然后从工厂bean创建对象,单例的工厂bean存储在factoryBeanObjectCache中,注意,单例不仅是isSingleton返回true而且bean本身必须是单例。
7.创建bean,调用 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(String, RootBeanDefinition, Object[])创建bean,
方法中,创建bean实例前先检查是否要创建代理对象,如下图所示。org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation =》 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization =》 org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization
其中一个InstantiationAwareBeanPostProcessor实现org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization就是创建代理的基类入口地方,最终会通过org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy创建代理。
回到实例创建主线逻辑:
如果不需要创建代理对象,则调用下面的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(String, RootBeanDefinition, Object[])方法真正创建bean,过程如下:
8.BeanWrapper里面包含bean实例等信息,bean属性注入也在这里org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(String, AbstractBeanDefinition, BeanWrapper):
9.如果bean实现InitializingBean接口,则在bean实例初始化后的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(String, Object, RootBeanDefinition)里面调用afterPropertiesSet方法。
下面贴下常见的一个后处理bean:
org.springframework.context.support.ApplicationContextAwareProcessor#postProcessBeforeInitialization代码