Spring 容器初始化流程
Spring 容器初始化流程.png
Spring 容器初始化流程大致流程如下:
- this():注册内置的BeanPostProcessor的BeanDefinition到容器
- register(annotatedClasses):注册配置类 BeanDefinition 到容器
- prepareRefresh():初始化前的准备工作,列如对系统属性或者环境变量进行验证
- obtainFreshBeanFactory():初始化 BeanFactory
- prepareBeanFactory(beanFactory):对 BeanFactory 进行各种功能的填充,比如对表达式的支持等
- postProcessBeanFactory(beanFactory):留给子类扩展用
- invokeBeanFactoryPostProcessors(beanFactory):执行BeanFactoryPostProcessor后置处理器
- registerBeanPostProcessors(beanFactory):创建并注册所有的BeanPostProcessor后置处理
- initMessageSource():初始化消息组件(国际化,消息绑定,消息解析)
- initApplicationEventMulticaster():初始化容器的事件机制
- onRefresh():初始化其他特殊Bean(留给子类做扩展用)
- registerListeners():注册监听器(ApplicationListener)
- finishBeanFactoryInitialization(beanFactory):创建并注册所有的单例且非懒加载的Bean
- finishRefresh():完成刷新过程,通知生命周期处理器 lifecycleProcessor 刷新过程,同时发出 ContextRefreshEvent 通知别人。
- resetCommonCaches():重置缓存
Spring Bean的生命周期
Spring Bean的生命周期.png
Spring Bean的生命周期:
- InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation():实例化Bean的前置处理
- createBeanInstance(beanName, mbd, args):实例化Bean
- MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition():合并Bean定义信息(自动装配元素)
- InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation():实例化Bean的后置处理
- InstantiationAwareBeanPostProcessor#postProcessPropertyValues():Bean的自动装配
- 部分Aware接口的自动装配:
BeanNameAware#setBeanName()
、BeanClassLoaderAware#setBeanClassLoader()
、BeanFactoryAware#setBeanFactory()
- BeanPostProcessor#postProcessBeforeInitialization():Bean初始化的前置处理
- 剩余部分Aware接口的自动装配:
EnvironmentAware#setEnvironment()
、EmbeddedValueResolverAware#setEmbeddedValueResolver()
、ResourceLoaderAware#setResourceLoader ()
、ApplicationEventPublisherAware#setApplicationEventPublisher ()
、MessageSourceAware#setMessageSource ()
、ApplicationContextAware# setApplicationContext ()
- @PostConstruct:执行初始化方法
- InitializingBean#afterPropertiesSet():执行初始化方法
- @Bean(initMethod = "initMethod"):执行初始化方法
- BeanPostProcessor#postProcessAfterInitialization():Bean初始化的后置处理
- DestructionAwareBeanPostProcessor#postProcessBeforeDestruction():销毁Bean的后置处理(@PreDestroy)
- DisposableBean#destroy():执行销毁方法
- @Bean(destroyMethod = "destroyMethod"):执行销毁方法
Spring AOP执行流程
Spring AOP流程图.png
Spring AOP执行流程:
-
@EnableAspectJAutoProxy
开启对AOP的支持,注册后置处理器AnnotationAwareAspectJAutoProxyCreator
- 根据Class对象找出所有切面类(有
@Aspect
注解的类) - 解析切面类中的增强器(解析@Before等注解),并放入缓存中
- 根据
ProxyFactory
工厂类创建AopProxy
代理器 - 根据
AopProxy
代理器创建代理类 - 通过增强器执行入口执行增强器
JdkDynamicAopProxy#invoke()
或CglibAopProxy.DynamicAdvisedInterceptor#intercept()
- 获取链接链
AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice()
- 以递归方式执行拦截链
ReflectiveMethodInvocation.proceed()
Spring 循环依赖:
Spring 循环依赖.png
Spring 循环依赖流程:
-
!this.singletonsCurrentlyInCreation.remove(beanName)
:将当前正创建Bean的标示放到Set集合中,如果失败则说明发生了循环创建,直接抛出BeanCurrentlyInCreationException
异常,防止死循环 -
addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory)
:将完成实例化但是还未完成赋值的对象放到singletonFactories
容器中,提前暴露出来 -
getSingleton(String beanName, boolean allowEarlyReference)
:当有对象创建过程中需要当前正在创建中的对象的时候就需要从singletonFactories
容器中获取对象,这时我们可以通过后置处理器SmartInstantiationAwareBeanPostProcessor
对获取到的对象进特殊处理,然后放到earlySingletonObjects
容器中 - 最后将创建完成的Bean放到
singletonObject
容器中
Spring Bean的自动装配
Spring Bean的自动装配.png
Spring Bean的自动装配过程:
- 根据
Class
对象,通过反射获取所有的Field
和Method
信息 - 通反射获取
Field
和Method
的注解信息,并根据注解类型,判断是否需要自动装配 - 将需要自动装配的元素,封装成
AutowiredFieldElement
或AutowiredMethodElement
对象 - 调用
AutowiredFieldElement
或AutowiredMethodElement
的inject
方法,唤起后续步骤 - 通过调用容器的
getBean()
方法找到需要注入的源数据Bean - 通过反射将找到的源数据Bean注入到目标Bean中
Spring Aware的自动装配
- 判断是否实现了
Aware
接口 - 判断具体实现了那个
Aware
接口 - 直接调用
XxxAware
接口的特有方法实现XxxAware
的自动装配
Spring MVC 流程图
902665-20170321135716705-1770961924.png
- 客户端用户发送请求至前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- HandlerMapping处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter处理器适配器,HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
- Controller控制器执行完成返回ModelAndView,HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet前端控制器将ModelAndView传给ViewReslover视图解析器。
- ViewReslover解析后返回具体View。
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中),并返回给客户端用户。
SpringMVC框架组件说明
以下组件通常使用框架提供实现:
- DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。
- HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
- HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。
- ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。