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