spring整体梳理
2021-01-18 19:30:03 20 举报
spring启动流程梳理,包含springmvc的内容
作者其他创作
大纲/内容
链式的调用通知的拦截器,最终在反射执行被拦截方法Joinpoint的invoke
doGetBean
同时缓存单例Bean
over
render视图渲染
getHandler返回包装了handle和拦截器连的对象
BeanDefinition类型判断.根据类型创建对象
2 注册到SpringIOC中
AAC中的回调postProcessBeanFactory
AbstractNestablePropertyAccessor#setPropertyValue()
initLocaleResolver初始化本地语言环境
PostProcessor后置处理器
1.工厂方法2.自动装配3.默认无参构造
registerListeners为事件传播器注册事件监听器
遍历Set设置作用域,通用注解,名称重复校验等
AdvisorAdapterRegistrationManager如果是切面的的通知期则加入到拦截器列表中
initViewResolvers初始化视图转换器
applyBeanPostProcessorsBeforeInitialization
初始化
Scope.get()
InstantiationAwareBeanPostProcessor的各种实现类,实现不同的属性赋值。如@Autowiered通过下面的方式实现赋值org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor 和 @Resource通过下面的方式实现赋值CommonAnnotationBeanPostProcessor(JSR-250标准)《反射获取方法,反射赋值》
processBeanDefinition
单例:创建单例并缓存
2
正常结束或异常都会调拦截器afterCompletion
存在通知链
doCreateBean
AAC
IOC初始化入口
1
BeanPostProcessor的实现类AbstractAutoProxyCreator#postProcessAfterInitialization
获取拦截器列表--->2
register
返回BeanWrapperImpl
if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> doSomething);}JDK安全管理
执行拦截器链的所有preHandle
ReaderContext#fireImportProcessed/fireAliasRegistered
ClassPathBeanDefinitionScanner#scan
HandlerMapping,主要就是保存url和Method的一一对应关系。遍历ioc找到@Controller或者派生出的注解,反射获取注解上的url,拼接之后,包装一下,和Mehod一起缓存到容器中
invokeBeanFactoryPostProcessors调用所有注册的BeanFactoryPostProcessor的Bean
AnnotationConfigEmbeddedWebApplicationContext
initServletBean
遍历
DispatchServlet
判断注解过滤规则List excludeFilters//排除List includeFilters//包含
不理解springboot之后的作用。因为基本上的属性都在这一步之前都注入完毕了
未中缓存
判断创建方法
checkMultipart检查是否是文件上传的请求
策略模式不同实现
createProxy
包装成执行链,HandlerExecutionChain并添加可以到达的拦截器。没找到返404
获取这个bean的 advice找到所有适合自动代理该类findEligibleAdvisors
refresh()
registerBeanDefinition
BeanDefinitionReaderUtils#registerBeanDefinition
策略加模板
JdkDynamicAopProxy#Proxy.newProxyInstance创建代理对象
AutowireCapableBeanFactory
定义自动装配规
registerBeanPostProcessors注册BeanPost事件后置处理器
属性装配
或者独立解析
postProcessBeanFactory子类指定特殊的BeanPost事件处理器
initMessageSource初始化信息源,和国际化相关
AbstractBeanFactory#getBean()从IOC容器中获取Bean
XmlBeanDefinitionReader#loadBeanDefinitions()
Xml 的 IOC 容器的初始化
如果是原始的bean,不是合成的bean,就会执行实例化之前的前置操作,实例化之前做一些自定义的处理操作。BeanPostProcessor#postProcessBeforeInitialization
具体的解析过程委派了BeanDefinitionParserDelegate执行解析
getSingleton
handleInternal调度
doDispatch
DefaultAopProxyFactory#createAopProxy创建AopProxy
对特殊的方法进行过滤。
由DefaultBeanDefinitionDocumentReader实现
doScan扫描给定包及其子包
ReaderEventListener#importProcessed/aliasRegistered
调用Bean实例对象初始化的方法,这个初始化方法是在Spring Bean定义配置。通过init-method属性指定的。先判断是不是实现了font color=\"#ff00ff\
否
存在则创建代理
initHandlerAdapters初始化参数适配器
registerBeanDefinitions
注册工具
ApplicationObjectSupport实现ApplicationContextAware
执行拦截器链的所有postHandle
类
scan
接口
检查是否继承了Aware接口的font color=\"#ff00ff\
初始化的判断Prepare method overrides
handle()实际的处理器处理请求
invokeHandlerMethod解析该方法上的参数,并反射调用该方法
AnnotatedBeanDefinitionReader#doRegisterBean
initThemeResolver初始化模板处理器
initHandlerMappings初始化handlerMapping
createBean
嵌入式的 IOC 容器的初始化
getHandlerAdapter获取处理器适配器
instantiateBean
其他:根据Scope的配置
AACB.InstantiationStrategy.instantiate反射 factoryMethod.invoke 实现
为空
parseDefaultElement使用Spring的Bean规则解析Document元素节点
返回Cglib的方式ObjenesisCglibAopProxy
AbstractDetectingUrlHandlerMapping#initApplicationContext
doLoadBeanDefinitions
BeanDefinition中存在MethodOverrides则定义了方法覆盖。instantiate是SimpleInstantiationStrategy内的重载方法。
loadBeanDefinitions加载
ConstructorResolver#autowireConstructor使用容器的自动装配特性,调用匹配的构造方法实例化
DefaultListableBeanFactory
finishRefresh初始化容器的生命周期事件处理器,并发布容器的生命周期事件
initializeBean
ApplicationContext
是否依赖项检查
initHandlerExceptionResolvers初始化异常拦截器
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
BeanFactory
ioc容器规范的定义
初始化后的实例化操作后置操作
doGetObjectFromFactoryBean调用Bean工厂的getObject方法生产指定Bean的实例对象
initMultipartResolver多文件上传组件
doRegisterBeanDefinitions解析xml并注册
如果是原始的bean,不是合成的bean,就会执行实例化之后的后置操作,实例化之后做一些自定义的处理操作。BeanPostProcessor#postProcessAfterInitialization
onRefresh
处理aop相关事宜
import--listalias--map
AbstractUrlHandlerMapping类实现
返回jdk方式JdkDynamicAopProxy
包装BeanDefinitionHolder根据代理模式穿件代理
prepareRefresh获取容器的当时时间,同时给容器设置同步标识
scanner.scanreader.register同上
AbstractApplicationContext=AACDefaultListableBeanFactory=DLBF
RootBeanDefinition
包装成BeanDefinitionHolder
invokeAwareMethods
processDispatchResult处理返回的结果
单例工厂
注解驱动 的 IOC 容器的初始化
initApplicationEventMulticaster初始化容器事件传播器
setApplicationContext
DLBF#registerBeanDefinition此处只是缓存bean的定义在getBean的时候才真正的初始化并缓存到真的IOC
ConstructorResolver#instantiateUsingFactoryMethod
AOP的处理
wrapIfNecessary过滤代理本身相关的类
注入
原型:每次创建一个新的
解析配置文件
initStrategies初始化MVC的九大组件
parseBeanDefinitionElement把<bean>信息封装成AbstractBeanDefinition并包装成BeanDefinitionHolder返回使用
是
finishBeanFactoryInitialization1.getBean2.初始化所有剩余的单例Beanlazy-init=false
1 setConfigLocations
资源转化成io流
AbstractAutowireCapableBeanFactory真正的实现createbean AACB
proceed方法按照通知连的顺序执行
定位font color=\"#009999\
初始化WebApplicationContext容器调用了abstractApplicationContext.refresh
执行的时候调用该类的invoke方法
初始化后的所有后置操作
DI依赖注入
getObjectFromFactoryBean
实现工厂Bean生产Bean对象实例的过程
FactoryBean创建的单例对象的缓存:FactoryBean名称和对象
Bean的解析
InstantiationAwareBeanPostProcessor#postProcessPropertyValues给Bean属性应用实例值之前的之前的后处理。可以检查注入额必要性和替换属性等
HierarchicalBeanFactory
有继承关系
createBeanInstance创建Bean的实例对象
AdvisedSupport#getInterceptorsAndDynamicInterceptionAdvice获得此方法上的interceptor列表
BeanWrapperImpl的父类AbstractPropertyAccessor#setPropertyValues开始属性赋值
AbstractBeanDefinitionReader#loadBeanDefinitions()
命中单例缓存
jdk的实现
invokeInitMethods初始化操作
RequestMappingHandlerAdapter
注册
3
用AnnotatedGenericBeanDefinition包装classc注解信息成bean的定义
getObjectForBeanInstance获取给定Bean的实例对象。span style=\"font-size: inherit;\
initRequestToViewNameTranslator初始化视图预处理器
getProxy创建新的代理类
invokeAndHandle
判断AOP代理配置管理器,是代理类,或者不支持SpringProxy接口
populateBean依赖注入 属性
ListableBeanFactory
可列表化
1 解析并生成Bean定义
渲染逻辑.......
initFlashMapManager
BeanPostProcessor#postProcessAfterInitialization
直接调用 method.invoke执行方法
applyBeanPostProcessorsAfterInitialization
AbstractApplicationContext
具体的实现AAC
0 条评论
回复 删除
下一页