- BeanFactory获取bean实例
- BeanDefinitionRegistry定义bean,实现此接口的类可以增删改查Bean的定义
- BeanDefinition代表一个bean的定义
- BeanDefinitionBuilder工具类,用于实例化BeanDefinition
- ListableBeanFactory可以查询bean可以认为是BeanDefinitionRegistry的扩充
- ApplicationContext只有一些getXX方法
- ConfigurableApplicationContext相比ApplicationContext增加了可配置的功能
**注:bean的访问和定义是通过两个接口来描述的,**BeanFactory只定义访问bean实例的方法,BeanDefinitionRegistry描述bean的定义。BeanFactory根据BeanDefinitionRegistry的描述来构建bean实例。通常BeanFactory的实现都会实现BeanDefinitionRegistry
ClassPathScanningCandidateComponentProvide查找包下面的指定的类
BeanWrapperImpl,实际开发中使用PropertyAccessorFactory#forBeanPropertyAccess来获取实例
DataBinder, bind方法使用BeanWrapper来给java bean的字段赋值,
- AbstractApplicationContext核心类,spring的初始化逻辑都在这里面,查看这个类可以明白spring的各个功能怎么使用。
- AbstractRefreshableApplicationContext,支持多次调用refresh方法
-
- NamespaceHandler处理各个名字空间,如context,aop,tx等等
实现类:PropertySourcesPlaceholderConfigurer,
- PlatformTransactionManager核心接口,用于抽象事务操作,目前有3中实现:DataSourceTransactionManager对应与普通的jdbc,JtaTransactionManager对应jta事务管理,HibernateTransactionManager对应hinernate 的事务管理
- TransactionDefinition定义一个事务,包括事务的传播,超时,然后使用PlatformTransactionManager创建
- TransactionStatus代表一个事务。
-
xml配置或注解的方式
内部实现是依赖spring的aop,将事物管理横切进目标bean。可以使用注解Transactional来定义事务(隔离,传播,回滚规则)
-
编程的方式操作事务
- 使用TransactionTemplate
- 直接使用PlatformTransactionManager
-
TaskExecutor
继承java的Executor接口,所以用法和java的Executor一样
-
TaskScheduler定义了调度方法。 1. Trigger:触发器,可以定义task执行的条件,由TaskScheduler使用,可以实现crond功能 2. TriggerContext:保存Trigger的上下文信息
实现
servlet 3.0的接口ServletContainerInitializer,用来支持通过程序来配置servler容器,用来替代web.xml
participant ServletContainer
activate ServletContainer
create DispatcherServlet
ServletContainer -> DispatcherServlet : new
activate DispatcherServlet
ServletContainer -> DispatcherServlet : HttpServletBean#init()
create BeanWrapper
DispatcherServlet-> BeanWrapper : new
activate BeanWrapper
note right
学习BeanWrapper的用法
end note
DispatcherServlet-> BeanWrapper : setPropertyValues
BeanWrapper -> DispatcherServlet: setXXX
deactivate BeanWrapper
DispatcherServlet -> DispatcherServlet : FrameworkServlet#initServletBean()
activate DispatcherServlet
DispatcherServlet -> DispatcherServlet : FrameworkServlet#initWebApplicationContext
activate DispatcherServlet
create WebApplicationContext
DispatcherServlet -> WebApplicationContext: createWebApplicationContext
activate WebApplicationContext
note left
创建webApplicationContext层级,并且刷新
end note
DispatcherServlet -> DispatcherServlet : onRefresh
activate DispatcherServlet
DispatcherServlet -> DispatcherServlet : initStrategies
activate DispatcherServlet
DispatcherServlet -> DispatcherServlet : initMultipartResolver
DispatcherServlet -> DispatcherServlet : initLocaleResolver
DispatcherServlet -> DispatcherServlet : initThemeResolver
DispatcherServlet -> DispatcherServlet : initHandlerMappings
DispatcherServlet -> DispatcherServlet : initHandlerAdapters
DispatcherServlet -> DispatcherServlet : initHandlerExceptionResolvers
DispatcherServlet -> DispatcherServlet : initRequestToViewNameTranslator
DispatcherServlet -> DispatcherServlet : initViewResolvers
DispatcherServlet -> DispatcherServlet : initFlashMapManager
deactivate DispatcherServlet
DispatcherServlet -> DispatcherServlet : FrameworkServlet#initFrameworkServlet
deactivate DispatcherServlet
deactivate DispatcherServlet
deactivate DispatcherServlet(*) --> 开始
if "detectAllHandlerMappings" then
-->[true] "搜索ApplicationContext中HandlerMapping的实现类,添加到handlerMappings中"
--> " "
else
-->[false] "添加HANDLER_MAPPING_BEAN_NAME名字的bean到handlerMappings中"
--> " "
endif
if "handlerMappings==null" then
-->[true] "读取DispatcherServlet.properties中配置的默认实现类"
note left
DispatcherServlet.properties中配置两个默认实现,
BeanNameUrlHandlerMapping和RequestMappingHandlerMapping
end note
endif
--> (*)participant WebApplicationContext
activate WebApplicationContext
participant RequestMappingHandlerMapping
activate RequestMappingHandlerMapping
WebApplicationContext -> RequestMappingHandlerMapping: ApplicationObjectSupport#setApplicationContext
activate RequestMappingHandlerMapping
RequestMappingHandlerMapping -> RequestMappingHandlerMapping: AbstractHandlerMapping#initApplicationContext
activate RequestMappingHandlerMapping
RequestMappingHandlerMapping -> RequestMappingHandlerMapping: AbstractHandlerMapping#extendInterceptors
RequestMappingHandlerMapping -> RequestMappingHandlerMapping: AbstractHandlerMapping#detectMappedInterceptors
RequestMappingHandlerMapping -> RequestMappingHandlerMapping: AbstractHandlerMapping#initInterceptors
deactivate RequestMappingHandlerMapping
deactivate RequestMappingHandlerMapping
RequestMappingHandlerMapping -> RequestMappingHandlerMapping: RequestMappingHandlerMapping#afterPropertiesSet
activate RequestMappingHandlerMapping
create RequestMappingInfo.BuilderConfiguration
RequestMappingHandlerMapping -> RequestMappingInfo.BuilderConfiguration: new
activate RequestMappingInfo.BuilderConfiguration
RequestMappingHandlerMapping -> RequestMappingInfo.BuilderConfiguration: setUrlPathHelper
RequestMappingHandlerMapping -> RequestMappingInfo.BuilderConfiguration: setPathMatcher
RequestMappingHandlerMapping -> RequestMappingInfo.BuilderConfiguration: setSuffixPatternMatch
RequestMappingHandlerMapping -> RequestMappingInfo.BuilderConfiguration: setTrailingSlashMatch
RequestMappingHandlerMapping -> RequestMappingInfo.BuilderConfiguration: setRegisteredSuffixPatternMatch
RequestMappingHandlerMapping -> RequestMappingInfo.BuilderConfiguration: setContentNegotiationManager
RequestMappingHandlerMapping -> RequestMappingHandlerMapping: AbstractHandlerMethodMapping#afterPropertiesSet
activate RequestMappingHandlerMapping
RequestMappingHandlerMapping -> RequestMappingHandlerMapping: AbstractHandlerMethodMapping#initHandlerMethods
note left
扫描applicationContext或祖先Context中的实体,
end note
deactivate RequestMappingHandlerMapping
deactivate RequestMappingHandlerMapping与initHandlerMappings的过程类似,默认的HandlerAdapter是
HttpRequestHandlerAdapter
SimpleControllerHandlerAdapter
RequestMappingHandlerAdapter
初始化
participant WebApplicationContext
activate WebApplicationContext
participant RequestMappingHandlerAdapter
activate RequestMappingHandlerAdapter
[-> RequestMappingHandlerAdapter: 构造函数
WebApplicationContext -> RequestMappingHandlerAdapter: afterPropertiesSet
afterPropertiesSet方法流程图
(*) --> initControllerAdviceCache()
if "this.argumentResolvers == null" then
--> [true] resolvers = getDefaultArgumentResolvers();
--> argumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);
--> " "
else
--> [false] " "
endif
if "this.initBinderArgumentResolvers == null" then
--> [true] resolvers = getDefaultInitBinderArgumentResolvers();
--> initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);
--> " "
else
--> [false] " "
endif
if "this.returnValueHandlers == null" then
--> [true] handlers = getDefaultReturnValueHandlers();
--> returnValueHandlers = new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers);
--> " "
else
--> [false] " "
endif
--> (*)相关组件
HandlerMethodArgumentResolver: 从请求中提取值, 并且使用WebDataBinder将值转化为hander method的参数对应的类型的值
WebDataBinderFactory: 创建WebDataBinder
WebDataBinder: 把HandlerMethodArgumentResolver提取的值,转换为handler method的参数对应的类型的值
DefaultArgumentResolvers
- RequestParamMethodArgumentResolver
- RequestParamMapMethodArgumentResolver
- PathVariableMethodArgumentResolver
- PathVariableMapMethodArgumentResolver
- MatrixVariableMethodArgumentResolver
- MatrixVariableMapMethodArgumentResolver
- ServletModelAttributeMethodProcessor
- RequestResponseBodyMethodProcessor使用HttpMessageConverter来将请求体转换为对象,并使用webDataBinder来验证对象
- RequestPartMethodArgumentResolver
- RequestHeaderMethodArgumentResolver
- RequestHeaderMapMethodArgumentResolver
- ServletCookieValueMethodArgumentResolver
- ExpressionValueMethodArgumentResolver
- SessionAttributeMethodArgumentResolver
- RequestAttributeMethodArgumentResolver
- ServletRequestMethodArgumentResolver
- ServletResponseMethodArgumentResolver
- HttpEntityMethodProcessor
- RedirectAttributesMethodArgumentResolver
- ModelMethodProcessor
- MapMethodProcessor
- ErrorsMethodArgumentResolver
- SessionStatusMethodArgumentResolver
- UriComponentsBuilderMethodArgumentResolver
- RequestParamMethodArgumentResolver
- ServletModelAttributeMethodProcessor
DefaultReturnValueHandlers
- ModelAndViewMethodReturnValueHandler
- ModelMethodProcessor
- ViewMethodReturnValueHandler
- ResponseBodyEmitterReturnValueHandler
- StreamingResponseBodyReturnValueHandler
- HttpEntityMethodProcessor
- HttpHeadersReturnValueHandler
- CallableMethodReturnValueHandler
- DeferredResultMethodReturnValueHandler
- AsyncTaskMethodReturnValueHandler
- ModelAttributeMethodProcessor
- RequestResponseBodyMethodProcessor
- ViewNameMethodReturnValueHandler
- MapMethodProcessor
participant DispatcherServlet
activate DispatcherServlet
participant HttpServletRequest
activate HttpServletRequest
participant WebApplicationContext
activate WebApplicationContext
participant HandlerExecutionChain
activate HandlerExecutionChain
participant HandlerAdapter
activate HandlerAdapter
[-> DispatcherServlet: doService
activate DispatcherServlet
DispatcherServlet -> HttpServletRequest: setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext)
DispatcherServlet -> HttpServletRequest: setAttribute 设置其他属性值
DispatcherServlet -> DispatcherServlet: doDispatch
activate DispatcherServlet
DispatcherServlet -> DispatcherServlet: checkMultipart
note left
调用MultipartResolver,并返回MultipartHttpServletRequest
end note
DispatcherServlet -> DispatcherServlet: getHandler
DispatcherServlet -> DispatcherServlet: getHandlerAdapter
DispatcherServlet -> HandlerExecutionChain: applyPreHandle
HandlerExecutionChain --> DispatcherServlet: true | false
DispatcherServlet -> HandlerAdapter: handle
HandlerAdapter --> DispatcherServlet: ModelAndView mv
DispatcherServlet -> DispatcherServlet: applyDefaultViewName
DispatcherServlet -> HandlerExecutionChain: applyPostHandle
DispatcherServlet -> DispatcherServlet: processDispatchResult
deactivate DispatcherServlet
deactivate DispatcherServlet
循环调用handlerMappings中的HandlerMapping#getHandler()方法,直到有HandlerMapping返回非空
对象退出循环,返回HandlerMapping#getHandler()返回的HandlerExecutionChain对象
AbstractHandlerMapping <|-- AbstractHandlerMethodMapping
AbstractHandlerMethodMapping <|-- RequestMappingInfoHandlerMapping
RequestMappingInfoHandlerMapping <|-- RequestMappingHandlerMapping
abstract class AbstractHandlerMapping {
+getHandler()
{abstract} #getHandlerInternal()
}(*) --> handler = getHandlerInternal(request)
if "handler==null" then
--> [true] "handler = getDefaultHandler()"
if "handler==null" then
--> [true] (*)
else
--> [false] " "
endif
else
--> [false] " "
if "handler instanceof String" then
note left
如果是字符串就认为是bean name,需要从applicationContext从取出
end note
-->[true] handlerName = (String) handler;
--> handler = obtainApplicationContext().getBean(handlerName);
--> " "
else
--> [false] " "
endif
--> executionChain = getHandlerExecutionChain(handler, request);
--> return executionChain
endif
--> (*)包含Object view ,ModelMap model, HttpStatus status三个字段。其中ModelMap直接集成LinkedHashMap保存键值对
- 通过注解RequestMapping创建RequestMappingInfo,RequestMappingHandlerMapping#createRequestMappingInfo
使用