Spring源码脉络
2019-11-26 15:18:34 0 举报
AI智能生成
登录查看完整内容
Spring 源码脉络
作者其他创作
大纲/内容
ListableBeanFactory提供Bean枚举能力
HierarchicalBeanFactory提供了访问父容器的能力
AutowireCapableBeanFactory提供了自动装配能力
ConfigurableBeanFactory提供了对容器的配置能力
BeanFactory
Bean的类型
beanClass
作用域,单例SINGLETON ,原型PROTOTYPE
scope
是否懒加载
isLazy
创建时依赖的其他Bean
dependsOn
主Bean
primary
Bean的初始化方法
initMethodName
重要属性
BeanDefinitionBean的定义
DefaultResourceLoader |- AbstractApplicationContext |- AbstractRefreshableApplicationContext |- AbstractRefreshableConfigApplicationContext |- AbstractXmlApplicationContext |- ClassPathXmlApplicationContext
为刷新准备上下文,主要设置状态量(是否关闭,是否激活),记录启动时间,初始化属性资源占位符、校验必填属性是否配置及初始化用于存储早期应用事件的容器
prepareRefresh()
主要用于获取一个新的BeanFactory,如果BeanFactory已存在,则将其销毁并重建,默认重建的BeanFactory为AbstractRefreshableApplicationContext;此外此方法委托其子类从XML中或基于注解的类中加载BeanDefinition
obtainFreshBeanFactory()
prepareBeanFactory()
在应用上下文内部的BeanFactory初始化结束后对其进行修改,在所有的BeanDefinition已被加载但还没有实例化bean,此刻可以注册一些特殊的BeanPostFactory,如web应用会注册ServletContextAwareProcessor等
postprocessBeanFactory()
调用注册在上下文中的BeanFactoryPostProcessor,如果有顺序则按顺序调用,并且一定再单列对象实例化之前调用
invokeBeanFactoryPostProcessors()
实例化并注册BeanPostProcessor,如果有显式的顺序则按照顺序调用一定在所有bean实例化之前调用
registerBeanPostProcessors()
初始化MessageSource,如果当前上下文没有定义则使用其父类的,如果BeanFactory中不能找到名称为messageSource中的bean,则默认使用DelegatingMessageSource
initMessageSource()
初始化font color=\"#0076b3\
initApplicationEventMulticaster()
在一些特定的上下文子类中初始化特定的bean,如在Webapp的上下文中初始化主题资源
onRefresh()
添加实现了ApplicationListener的bean作为监听器,它不影响非bean的监听器;还会使用多播器发布早期的ApplicationEvent
registerListeners()
实例化所有非延迟加载的单例,完成BeanFactory的初始化工作
finishBeanFactoryInitialization()
完成上下文的刷新工作,调用LifecycleProcessor的onFresh()及发布的ContextRefreshEvent事件
finishRefresh()
重置Spring公共的缓存,如:ReflectionUtils、ResolvableType、CachedIntrospectionResults的缓存
resetCommonCaches()
AbstractApplicationContext.refresh()
ApplicationContext
getBeanDefinition返回给定bean名称的bean定义
getMergedLocalBeanDefinition返回合并的RootBeanDefinition每个bean名称对应自己的RootBeanDefinition,所有的RootBeanDefinition存在AbstractBeanFactory.mergedBeanDefinitions这个ConcurrentHashMap中
font color=\"#0076b3\
对象三级缓存
createBean
ObjectFactory.getObject()工厂设计模式创建bean
DefaultSingletonBeanRegistry.addSingleton把实例化对象放入DefaultSingletonBeanRegistry.singletonObjects这个ConcurrentHashMap中
getSingleton如果是单例,实现方法DefaultSingletonBeanRegistry.getSingleton
createBean如果是原型,直接创建bean
如果是其他作用域(scope)
AbstractBeanFactory.doGetBean具体获取Bean的方法
AbstractBeanFactory.getBean获取Bean
resolveBeforeInstantiation实例化之前的调用,调用所有的InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法
instantiateUsingFactoryMethod实例化需要工厂方法创建的bean
autowireConstructor实例化基于构造函数注入的bean
instantiateBean实例化普通的bean
createBeanInstance实例化Bean
applyMergedBeanDefinitionPostProcessors按序执行所有的MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition
getEarlyBeanReference获取一个用于早期访问指定bean的引用,通常是为了解决循环引用。
addSingletonFactory如果是单例且允许循环引用,缓存单例工厂,以便能够解析循环引用
InstantiationAwareBeanPostProcessor
invokeAwareMethods为实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口的bean设置beanName、beanClassLoader、beanFactory
applyBeanPostProcessorsBeforeInitialization顺序执行Bean后置处理器的postProcessBeforeInitialization方法 带@PostConstruct注解的方法由InitDestroyAnnotationBeanPostProcessor在此执行
invokeInitMethods执行初始化方法InitializingBean.afterPropertiesSet(),以及自定义的init-method指定的方法
applyBeanPostProcessorsAfterInitialization顺序执行Bean后置处理器的postProcessAfterInitialization方法 一般,aop代理对象在此生成
initializeBean初始化Bean
doCreateBean具体创建Bean的方法
registerDisposableBeanIfNecessary注册Bean的Disposable接口,用于执行销毁逻辑
AbstractAutowireCapableBeanFactory.createBean创建Bean
findAutowiringMetadata查找Bean需要AutoWired的元数据,比如属性、setter、构造函数
AutowiredMethodElement.inject属性注入
AutowiredAnnotationBeanPostProcessor Bean @AutoWired自动装配
CommonAnnotationBeanPostProcessor@Resource @WebServiceRef @EJB等注解的自动装配
InstantiationAwareBeanPostProcessor实现Bean自动装配的接口postProcessPropertyValues
Bean创建过程
ApplicationContextAware
BeanNameAware
ServletContextAware
BeanFactroyAware
ImportAware
感知接口 *Aware
ApplicationEventPublisher:广播服务
SimpleApplicationEventMulticaster
ApplicationEventMulticaster:多播器
ApplicationEventApplicationContextEvent 事件
ApplicationListener:监听器
广播与监听
UrlResource
ClassPathResource
FileSystemResource
InputArrayResource
Resource
注入方式:ResourceLoaderAware
ClassPathScanningCandidateComponentProvider
PathMatchingResourcePatternResolver
ResourcePatternResolver
ResourceLoader
资源
profiles
PropertySource
properties
Environment
运行环境抽象
IOC/DI
应用程序上下文可以在其bean定义中自动检测BeanPostProcessor类型的bean,并将它们应用于随后创建的任何bean
针对具体的bean进行处理
调用逻辑:AbstractAutowireCapableBeanFactory.initializeBean注册逻辑:PostProcessorRegistrationDelegate.registerBeanPostProcessors
AutowiredAnnotationBeanPostProcessor实现AutoWired注解的注入
MergedBeanDefinitionPostProcessor
ApplicationContextAwareProcessor
ServletContextAwareProcessor
**AwareProcessor实现感知接口
ScheduledAnnotationBeanPostProcessor
后置Bean处理器BeanPostProcessor
允许自定义修改应用程序上下文的bean定义,调整bean的属性
自动检测,并在创建任何非BeanFactoryPostProcessor类型bean之前应用它们
调用逻辑:AbstractApplicationContext.refresh()AbstractApplicationContext.invokeBeanFactoryPostProcessorsPostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
RootBeanDefinition
ChildBeanDefinition
GenericBeanDefinition
BeanDefinition
BeanDefinitionBuilder
BeanDefinitionHolder
注册一个类到Spring容器中
BeanDefinitionRegistry
扫描符合要求的bean定义
ClassPathBeanDefinitionScanner
BeanDefinitionRegistryPostProcessorbean注册处理器
动态代理接口并注册到Spring容器
Mybatis mapper接口动态代理实现,MapperScannerConfigurer+MapperFactoryBean
后置BeanFactory处理器BeanFactoryPostPorcessor
自定义实例化逻辑
Mybatis mapper 接口动态代理实现,MapperFactoryBean
FactoryBean
容器扩展
b style=\
切面是通知/增强和切入点的综合体
AspectJ 切面
ProceedingJoinPoint
对应的是具体被拦截的对象,因为Spring只能支持方法,所以被拦截的对象就是指特定的方法
Joinpoint 连接点
execution
within
this
target
切入点是对一系列代表同种功能连接点的统称
examples
Pointcut 切入点
类型:font color=\"#0076b3\
通知/增强处理是在切入点执行的操作,是要实现的功能的代码
Advice 通知/增强处理
引介是另一种类型的增强,它可以为类添加一些属性和方法。它和通知是并列的两种不同的增强
Introduction 引介增强
切面作用到目标代码中的方式,Spring内置的AOP采用的是动态代理的织入方式
Weaving 织入
InvocationHandlerProxy.newProxyInstance()
接口代理:JDK动态代理
MethodInterceptorEnhancer.create
类代理:CGLIB代理
Porxy 代理
想要织入的一批符合条件的对象
Target 目标对象
getAdvice获取增强
getPointcut获取切入点
getAdvisor获取Advisor
ReflectiveAspectJAdvisorFactory.getAdvisors在指定AspectJ实例上为所有定义了切面的方法构建AOP Advisor
BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors()在所有bean实例化之前,初始化所有切面
postProcessAfterInitializationbean初始化后执行的后置处理方法
wrapIfNecessary包装
ProxyFactory.getProxy代理工厂获取代理
createProxy创建代理
AbstractAutoProxyCreator代理创建类
ObjenesisCglibAopProxyCgLib代理
AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice获取执行方法的拦截器链
proceedJoinpoint.proceed 继续执行链中的下一个拦截器责任链模式
Spring Aop的方法执行简单模型
ReflectiveMethodInvocation执行反射方法
JdkDynamicAopProxyJDK代理
DefaultAopProxyFactory默认代理工厂
AspectJMethodBeforeAdvice前置增强,@Before
AspectJAroundAdvice环绕增强,@Around
AspectJAfterAdvice后置增强,@After
AspectJAfterReturningAdvice返回增强,@AfterReturning,对应拦截器AfterReturningAdviceInterceptor
AspectJAfterThrowingAdvice异常增强,@AfterThrowing
AbstractAspectJAdvice增强实现,每一种增强方式对应一个子类
实现
AOP
@Controller
@RestController
@GetMapping
@PostMapping
@RequestMapping
@ResponseBody
@PathVariable
注解
WebMvcAutoConfigurationSpringBoot自动配置类
registerHandlerMethod注册Handler方法
detectHandlerMethods查找并注册指定bean的方法
RequestMappingHandlerMapping .afterPropertiesSet实现了InitializingBean接口,先调用自身的afterPropertiesSet方法,然后调用父类的afterPropertiesSet方法
createWebApplicationContext创建ConfigurableWebApplicationContext对象
configureAndRefreshWebApplicationContext配置刷新上下文
initWebApplicationContext初始化SpringWeb环境上下文
ContextLoader
初始化
initHandlerMappings初始化HandlerMappings
initHandlerAdapters初始化HandlerAdapters
initHandlerExceptionResolvers初始化异常处理器
initViewResolvers初始化视图处理器
initStrategies初始化配置
checkMultipart检查是否是文件上传请求
addMatchingMappings查找所有合适的mappings
lookupHandlerMethod查找Handler方法
getHandlerInternal获取Handler(要执行的Controller方法)主要实现在AbstractHandlerMethodMapping
getHandlerExecutionChain构建HandlerExecutionChain,并设置拦截器
getCorsHandlerExecutionChain如果是跨域请求,则设置跨域配置
AbstractHandlerMapping .getHandler获取Handler
getHandlerAdapter获取处理器适配器,RequestMappingHandlerAdapter为主要实现
mappedHandler.applyPreHandle执行拦截器preHandle方法
createInvocableHandlerMethod创建可调用handler方法,ServletInvocableHandlerMethod类型
HandlerMethodArgumentResolverComposite .supportsParameter判断参数是否有解析器处理
HandlerMethodArgumentResolverComposite .resolveArgument解析参数,找到指定的参数解析器HandlerMethodArgumentResolver来解析参数普通的对象参数交给ModelAttributeMethodProcessor处理
getMethodArgumentValues获取所有参数的值循环所有的参数并交给对应的参数解析器处理
doInvoke(args)执行反射方法
InvocableHandlerMethodb style=\
writeWithMessageConverters通过消息转换器写回返回结果
selectHandler查找对应的返回结果处理器(HandlerMethodReturnValueHandler)@ResponseBody注解对应的结果处理器:RequestResponseBodyMethodProcessor
HandlerMethodReturnValueHandlerComposite.handleReturnValue处理返回结果
invokeAndHandle执行处理
ServletInvocableHandlerMethod .invokeHandlerMethod执行handler方法
getModelAndView获取ModelAndView
invokeHandlerMethod执行Handler方法
mappedHandler.applyPostHandle执行拦截器postHandle方法
HandlerExceptionResolverComposite .resolveException如果异常处理器是异常处理器组合,则执行组合中的所有的异常处理器,直到有结果返回@ExceptionHandler标注的异常处理器有ExceptionHandlerExceptionResolver处理
HandlerExceptionResolver .resolveException找到所有的异常处理器来处理异常,如果处理结果不为空则返回
processHandlerException如果异常不为空则处理异常
viewResolver.resolveViewName找到指定的视图解析器获取视图例如:FreeMarkerViewResolver
view = resolveViewName根据视图名称和model数据获取view(视图)
子主题
view.render渲染视图例如:FreeMarkerView
renderRender the given ModelAndView.
processDispatchResult处理结果(处理异常并渲染结果)
doService处理请求 doDispatch实际处理请求逻辑的方法
返回结果拦截处理
Spring MVC
实现:ConfigurationClassPostProcessor
@Configuration
@EnableSchedulingSchedulingConfiguration
导入Bean:font color=\"#0076b3\
@EnableAspectJAutoProxyMyImportBeanDefinitionRegistrar
通过ImportBeanDefinitionRegistrar将类注入到Spring IOC容器
@EnableAsyncAsyncConfigurationSelector
@EnableAutoConfigurationAutoConfigurationImportSelector
通过ImportSelector方式注入Bean
@Enable**
@Import
导入资源
@ImportResource
指定某方法生成一个由Spring容器管理的bean
应该与@Scope、@Lazy、@DependsOn和@Primary等注解一起使用来声明这些语义
@Bean
@Profile
@Service
@Repository
@Component
@DependsOn
@Value配置属性注入
@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean
例
@Conditional条件装配
@ComponentScan
Spring JavaConfig
SpringBoot1.4中文文档
SpringBoot工程初始化
SpringApplication
开启自动配置功能
AutoConfigurationImportSelector
@EnableAutoConfiguration
@SpringBootConfiguration
@SpringBootApplication
META-INF/spring-configuration-metadata.json
声明该类中的所有属性和配置文件中相关的配置进行绑定
prefix:声明配置前缀,将改前缀下的所有属性进行映射
DataSourceProperties
@ConfigurationProperties(prefix = \"spring.datasource\")
profile
配置文件application.propertiesapplication.yaml
SpringFactoriesLoader
META-INF/spring.factories
Spring Factories
Actuator
Spring Boot
//定义解析器ExpressionParser parser = new SpelExpressionParser();
//解析表达式Expression exp = parser.parseExpression(\"'Hello World'\");
//获取结果message=\"Hello World\"String message = (String) exp.getValue();
SpELSpring Expression LanguageSpring表达式
@EnableScheduling
Cron表达式方式执行
cron
固定间隔任务
fixedDelay
固定频率执行
fixedRate
@Schedule
ScheduledTaskRegistrar
ScheduleConfigurer
自定义TaskSchedule线程池
@Async
@EnableAsync
AsyncConfigurer
方法异步执行
Spring Schedule任务调度
异步调用
重试机制
缓存
@Cacheable
缓存更新
@CachePut
缓存清除
@CacheEvict
复杂配置
@Caching
@CacheConfig
CacheResolver
CacheManager
Cache
关键类
EL表达式
Cache缓存
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({\"classpath*:applicationContext.xml\"})
Spring Test
支持当前事务,如当前没有事务,则新建一个
PROPAGATION_REQUIRED
支持当前事务,如当前没有事务,则已非事务性执行
PROPAGATION_SUPPORTS
支持当前事务,如当前没有事务,则抛出异常(强制一定要在一个已经存在的事务中执行,业务方法不可独自发起自己的事务)
PROPAGATION_MANDATORY
始终新建一个事务,如当前原来有事务,则把原事务挂起
PROPAGATION_REQUIRES_NEW
不支持当前事务,始终已非事务性方式执行,如当前事务存在,挂起该事务
PROPAGATION_NOT_SUPPORTED
不支持当前事务;如果当前事务存在,则引发异常
PROPAGATION_NEVER
如果当前事务存在,则在嵌套事务中执行,如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作(注意:当应用到JDBC时,只适用JDBC 3.0以上驱动)。
PROPAGATION_NESTED
事务的传播属性
这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
ISOLATION_DEFAULT
该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别
ISOLATION_READ_UNCOMMITTED
该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
ISOLATION_READ_COMMITTED
该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。
ISOLATION_REPEATABLE_READ
所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
ISOLATION_SERIALIZABLE
事务的隔离级别
声明式事务
Swagger2整合
DefaultBeanDefinitionDocumentReader
BeanDefinitionDocumentReader
BeanDefinitionParserDelegate
BeanDefinitionParser
默认XML标签解析
Spring Data
RestTemplate
其他
路径匹配
AntPathMatcher
StopWatch
BeanUtils
获取方法参数名
ParameterNameDiscoverer
实现异步长连接的服务端实时推送
DeferredResult
Spring好用的工具类
Framework for building Java applications
Inversion of Control (IoC)
Dependency Injection (DI)
Aspect-Oriented Programming (AOP)
Transaction Management
MVC Framework
Integration with other frameworks and technologies
Features
Core Container
Data Access/Integration
Web
Instrumentation
Messaging
Test
Modules
Spring Core
Bean
Context
SpEL (Spring Expression Language)
JDBC
ORM (Object-Relational Mapping)
OXM (Object-XML Mapping)
JMS (Java Message Service)
Web MVC
Transaction
WebSocket
WebSockets
Servlet
Portlet
Access/Integration
AspectJ integration
Spring AOP
Spring Instrumentation
Spring Messaging
Spring JMS
Spring AMQP
https://spring.io/
https://docs.spring.io/spring-framework/docs/current/reference/html/
References
Spring
0 条评论
回复 删除
下一页