spring源码解析
2023-12-19 14:35:28 0 举报
AI智能生成
登录查看完整内容
1、springbean创键 2、refresh全流程 3、springaop 4、spring transactional 5、spring常用注解 6、持续更新...
作者其他创作
大纲/内容
Spring源码解析
1、transformedBeanName
1、this.singletonObjects.get(beanName)
2、singletonObject == null && isSingletonCurrentlyInCreation(beanName)
3、this.earlySingletonObjects.get(beanName)
4、singletonObject == null && allowEarlyReference
5、this.singletonFactories.get(beanName);
6、后续操作
2、DefaultSingletonBeanRegistry.getSingleton(循环依赖)
1、getCachedObjectForFactoryBean(beanName)
1、factory.isSingleton() && containsSingleton(beanName)
3、beforeSingletonCreation(beanName);
5、afterSingletonCreation(beanName);
3、getObjectForBeanInstance,FactoryBean创建bean实例
4、getParentBeanFactory
5、markBeanAsCreated
6、getMergedLocalBeanDefinition
7、checkMergedBeanDefinition
8、mbd.getDependsOn()
12、getBean(dep)
13、DefaultSingletonBeanRegistry.getSingleton 放入一级缓存
AbstractAutowireCapableBeanFactory.createBean
14、AbstractAutowireCapableBeanFactory.createBean 创建Bean源码解析
1、TypeConverterSupport.convertIfNecessary
15、adaptBeanInstance
doGetBean
AbstractBeanFactory.getBean
BeanFactory和FactoryBean的区别
Sping getBean加载源码解析
2、mbdToUse.prepareMethodOverrides();
1、applyBeanPostProcessorsBeforeInstantiation()
2、applyBeanPostProcessorsAfterInitialization()
1、BeanWrapper instanceWrapper = null;
2、this.factoryBeanInstanceCache.remove(beanName)
1、resolveBeanClass
2、AbstractBeanDefinition.getInstanceSupplier
3、instantiateUsingFactoryMethod
4、autowireConstructor
2、new BeanWrapperImpl(beanInstance);
3、initBeanWrapper(bw);
4、instantiateBean
4、instanceWrapper.getWrappedInstance()
1、postProcessMergedBeanDefinition
2、findAutowiringMetadata
3、buildAutowiringMetadata
4、findAutowiredAnnotation
1、AutowiredAnnotationBeanPostProcessor
2、CommonAnnotationBeanPostProcessor
1、InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
1、unsatisfiedNonSimpleProperties
2、containsBean
3、getBean(propertyName)
2、autowireByName
1、getCustomTypeConverter()
2、unsatisfiedNonSimpleProperties
PropertyDescriptor.getWriteMethod
3、BeanUtils.getWriteMethodParameter
3、autowireByType
4、applyPropertyValues
1、invokeAwareMethods
BeanPostProcessor.postProcessBeforeInitialization bean初始化前扩展点
2、applyBeanPostProcessorsBeforeInitialization
3、invokeInitMethods
BeanPostProcessor.postProcessAfterInitialization bean初始化后扩展点
4、applyBeanPostProcessorsAfterInitialization aop创建代理类
AbstractAutowireCapableBeanFactory.initializeBean 初始化Bean时创建aop增强
9、registerDisposableBeanIfNecessary
Spring createBean源码解析
1、getSingleton(beanName)
1、mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)
AbstractAutowireCapableBeanFactory.applyPropertyValues
BeanDefinitionValueResolver.resolveValueIfNecessary
AbstractBeanFactory.getBean(resolvedName); 回调,获取暴露的三级缓存
2、AbstractAutowireCapableBeanFactory.doCreateBean
1、AbstractBeanFactory.doGetBean
Spring 循环依赖解决
1、判断ServletContext是否已存在SpringMVC根上下文,存在则报错
利用反射加载类
2、createWebApplicationContext 创建上下文根容器
3、loadParentContext(servletContext); 如果存在着父容器,则加载父容器
1、sc.getInitParameter(CONFIG_LOCATION_PARAM)
Spring refresh 全过程源码解析
2、wac.refresh(); 刷新父容器
4、configureAndRefreshWebApplicationContext 加载并刷新上下文环境,也就是初始化Spring容器
5、将创建完的根上下文绑定到ServletContext
initWebApplicationContext
ContextLoaderListener web application启动时创建一个Spring的ROOT上下文。
1、从ServletConfig中解析出Servlet配置中的init-param参数,并封装到PropertyValues中
2、将当前的servlet包装为一个BeanWrapper,从而能够以Spring的方式对init-param的值进行注入
FrameworkServlet.initServletBean
3、initServletBean 调用子类FrameworkServlet来实例化servletBean
HttpServletBean.init
1、WebApplicationContextUtils.getWebApplicationContext(getServletContext()) 从ServletContext对象中获取到Spring Root上下文对象
2、cwac.setParent(rootContext) 设置子容器和父容器关系的关键代码.
1、wac.setServletContext 设置子容器的属性
2、wac.addApplicationListener 传入ContextRefreshListener事件
3、wac.refresh() 刷新完成之后,Controller,ViewResolver以及HandlerMapper将会加入到IOC容器中
3、configureAndRefreshWebApplicationContext 配置并刷新SpringWeb上下文对象
DispatcherServlet.onRefresh
4、onRefresh(wac) 通过子类去初始化SpringMVC的九大组件
1、initWebApplicationContext 初始化Web应用上下文对象
2、initFrameworkServlet 扩展点
3、initServletBean 调用子类FrameworkServlet来实例化servletBean
1、initMultipartResolver 文件上传解析器
2、initLocaleResolver 初始化国际化解析器组件
3、initThemeResolver 初始化主题解析器
this.handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values()); 查找出的mapping放在handlerMappings属性上
4、initHandlerMappings 处理器映射器(url和Controller方法的映射)
5、initHandlerAdapters 处理器适配器(实际执行Controller方法)
6、initHandlerExceptionResolvers 处理器异常解析器
7、initRequestToViewNameTranslator 初始化视图名称转换器组件
8、initViewResolvers 视图解析器
9、initFlashMapManager 初始化FlashMap管理器组件,用来在重定向过程中携带数据
initStrategies
4、onRefresh(wac) 通过子类去初始化SpringMVC的九大组件
1、isHandler(beanType) 判断是否有@Controller注解
2、getMappingForMethod 获取@RequestMapping注解的方法,设置prefix
3、registerHandlerMethod 封装方法为可执行的Method,注册到URL-Controller方法映射表
processCandidateBean 解析@Controller、@RequestMapping注解
afterPropertiesSet
RequestMappingHandlerMapping
<mvc:annotation-driven /> 解析映射关系
1、getDefaultArgumentResolvers 默认的参数解析器,包括@RequestParam @RequestBody
2、getDefaultInitBinderArgumentResolvers InitBinder解析器
3、getDefaultReturnValueHandlers 初始化返回值处理器 @RespsonBody
RequestMappingHandlerAdapter 参数处理解析
Servlet初始化
1、checkMultipart 用来判断请求是否为文件上传请求.
2、getHandler 根据请求查找请求处理器
3、noHandlerFound 没有找到返回404
4、getHandlerAdapter(mappedHandler.getHandler()) 查找当前请求处理器对应的适配器
5、applyPreHandle 处理请求之前,执行拦截器中配置的方法,获取到配置的所有拦截器,循环遍历,依次执行
6、ha.handle 执行SpringMVC中真实对应的业务方法
7、applyDefaultViewName 查找视图路径
8、applyPostHandle 处理请求之后执行拦截器方法
doResolveHandlerMethodException
resolver.resolveException 异常处理器
processHandlerException 处理异常
9、processDispatchResult 将处理完成之后的结果进行页面视图渲染。比如:跳转到Jsp页面. 处理全局异常
DispatcherServlet.doService
spring mvc前端控制器请求流程
HttpMessageConverter
HandlerMethodArgumentResolver 参数解析器接口
HandlerMethodReturnValueHandler 返回值处理器接口
循环所有参数
resolvers.supportsParameter 获取支持解析的参数类型,不支持抛异常
getArgumentResolver 获取参数解析器
converter.canRead 判断转换器是否支持参数类型
((HttpMessageConverter<T>) converter).read read方法执行HTTP报文到参数的转换
readWithMessageConverters 通过HttpMessageConverter读取HTTP报文
resolver.resolveArgument 获取到具体的参数解析器,解析参数
this.resolvers.resolveArgument 解析参数
getMethodArgumentValues 解析方法的入参,已
doInvoke 执行反射调用
InvocableHandlerMethod.invokeForRequest 执行请求,解析入参
selectHandler 查找参数解析器
converter.canWrite 判断是否支持返回值类型
((HttpMessageConverter) messageConverter).write 执行返回值转换
handleReturnValue 执行返回值处理
handleReturnValue 返回值处理
ServletInvocableHandlerMethod.invokeAndHandle
@RequestBody和@ResponseBody 理解spring参数解析
1、ControllerAdviceBean.findAnnotatedBeans(getApplicationContext()) 找到所有@ControllerAdvice注解
2、ExceptionHandlerMethodResolver(beanType) 找到所有@ExceptionHandler注解的方法,放到map缓存中
initExceptionHandlerAdviceCache
getExceptionHandlerMethod 根据exceptionHandlerAdviceCache这个找到具体需要处理异常的方法
1、getExceptionHandlerMethod 根据HandlerMethod和exception获取异常处理的Method
2、exceptionHandlerMethod.invokeAndHandle 执行异常处理方法
doResolveHandlerMethodException处理异常
ExceptionHandlerExceptionResolver
spring mvc统一异常处理
Spring MVC源码解析
spring-boot-dependencies parent实现依赖管理
@SpringBootConfiguration 标注在某个类上,表示这是一个Spring Boot的配置类
@AutoConfigurationPackage
@EnableAutoConfiguration 通知SpringBoot开启自动配置功能
@SpringBootApplication 说明这个类是SpringBoot的主配置类
@Import(AutoConfigurationPackages.Registrar.class) 默认将主配置类(@SpringBootApplication)所在的包及其子包里面的所有组件扫描到Spring容器中
getCandidateConfigurations
AutoConfigurationImportSelector 导入组件的选择器
spring boot主启动类注解
1、设置主启动类,属性存储起来
2、deduceFromClasspath 设置应用类型是Standard还是Web
SpringFactoriesLoader.forDefaultResourceLocation
3、getSpringFactoriesInstances 获取spring工厂BootstrapRegistryInitializer
4、setInitializers 设置初始化器ApplicationContextInitializer
5、setListeners 设置监听器ApplicationListener
6、deduceMainApplicationClass 获取main方法所在类
1、SpringApplication 构造方法
1、createBootstrapContext 创建一个DefaultBootstrapContext对象
2、configureHeadlessProperty 设置headless模式
SimpleApplicationEventMulticaster 广播器
refreshApplicationListeners 刷新监听器,并清除缓存,发布事件前调用
getApplicationListeners 通过事件类型ApplicationStartingEvent获取对应的监听器
onApplicationEvent
doInvokeListener
invokeListener 发布事件给所有监听器(存在异步或同步)
this.initialMulticaster.multicastEvent 发布事件
multicastInitialEvent
EventPublishingRunListener 事件推送监听器
3、getRunListeners 获取所有监听器 spring观察者模式重要案例
listeners.environmentPrepared(environment) 发布环境已准备事件
EnvironmentPostProcessorApplicationListener 加载配置的监听器,properties 和yml文件都是其内部类所加载
4、prepareEnvironment 根据SpringApplicationRunListeners以及参数来准备环境
5、printBanner 启动打印Banner.txt
6、createApplicationContext 创建Spring容器
1、context.setEnvironment 设置容器环境
2、postProcessApplicationContext 执行容器后置处理
3、applyInitializers 执行容器中的ApplicationContextInitializer
4、listeners.contextPrepared 发送容器已经准备好的事件,通知各监听器
5、registerSingleton(\"springApplicationArguments\
6、getBeanFactory().registerSingleton(\"springBootBanner\
load
7、load 加载启动类
8、listeners.contextLoaded 发布容器已加载事件
7、prepareContext spring容器前置处理
refresh全流程解析
spring refresh 刷新容器
8、refreshContext 刷新容器
9、afterRefresh spring容器后置处理
10、listeners.started 发出结束执行的事件
ApplicationRunner
CommandLineRunner
11、this.callRunners 执行Runners 启动时初始化数据
2、run 方法
ApplicationEventPublisher、ApplicationEventMulticaster 发布事件
ApplicationListener 承JDK的 EventListener ,所有监听者都继承它,也就是我们所说的观察者,也可以使用注解 @EventListener
spring 观察者模式
spring boot 自动配置
spring boot 启动流程源码解析
1、新建Module {模块名}-spring-boot-starter
2.编写自动配置类AutoConfig
3、编写spring.factories文件加载自动配置类
4、自定义starter,pom配置
5、打包安装 install
6、将打包文件上传至私服,或配置本地仓库
7、其它项目pom引用
spring boot自定义starter
1、默认tomcat
2、切换容器
ServletWebServerApplicationContext.createWebServer
9、onRefresh SpringBoot也是在该步骤中启动内嵌Tomcat容器的
3、onRefresh 启动servlet
spring boot内置servlet容器
ServletRegistrationBean
FilterRegistrationBean
ServletListenerRegistrationBean
1、自定义Servlet、Filter、Listener
DispatcherServletAutoConfiguration DispatcherServlet注解配置类
spring boot 如何实现spring mvc
DataSourceTransactionManagerAutoConfiguration 事务注解自动配置类创建DataSourceTransactionManager并注入Spring容器中
@EnableTransactionManagement 开启事务
spring boot事务源码解析
AopAutoConfiguration aop 注解自动配置类
spring boot集成aop
spring boot源码解析
super()
1、resolvePath,解析路径
2、AbstractPropertyResolver.resolveRequiredPlaceholders
3、AbstractPropertyResolver.doResolvePlaceholders
4、PropertyPlaceholderHelper.parseStringValue
AbstractRefreshableConfigApplicationContext.setConfigLocations 解析xml文件名称
startupShutdownMonitor 锁对象
1、记录容器的状态和启动时间
2、initPropertySources() 扩展点
3、getEnvironment().validateRequiredProperties()
4、初始化监听器
1、prepareRefresh() 刷新容器准备
1、destroyBeans
1、new XmlBeanDefinitionReader(beanFactory)
2、initBeanDefinitionReader 扩展点
3、customizeBeanFactory(beanFactory);
1、AbstractBeanDefinitionReader.loadBeanDefinitions(String location)
3、XmlBeanDefinitionReader.loadBeanDefinitions(EncodedResource encodedResource)
1、getValidationModeForResource
2、DefaultDocumentLoader.parse
1、doLoadDocument
1、DefaultBeanDefinitionDocumentReader.registerBeanDefinitions
2、doRegisterBeanDefinitions
4、profile配置读取,切换环境
5、preProcessXml(root) 扩展点
1、importBeanDefinitionResource(ele);
2、processAliasRegistration(ele);
1、parseBeanDefinitionElement
2、decorateBeanDefinitionIfRequired
3、BeanDefinitionReaderUtils.registerBeanDefinition
1、getNamespaceURI
1、getHandlerMappings
配置文件,aop解析流程
2、namespaceHandler.init() 重要示例AOP、MVC标签解析
2、this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri)
2、delegate.parseCustomElement 自定义标签解析
6、parseBeanDefinitions
7、postProcessXml(root); 扩展点
2、registerBeanDefinitions
4、XmlBeanDefinitionReader.doLoadBeanDefinitions
4、loadBeanDefinitions(beanDefinitionReader)
2、AbstractXmlApplicationContext.loadBeanDefinitions
1、AbstractRefreshableApplicationContext.refreshBeanFactory()
2、obtainFreshBeanFactory() 获取Bean工厂,解析xml文件
1、setBeanExpressionResolver SPEL解析器
2、addPropertyEditorRegistrar 添加属性编辑注册器
3、addBeanPostProcessor 添加Bean后置处理器
4、ignoreDependencyInterface(EnvironmentAware.class)
5、ignoreDependencyInterface(EmbeddedValueResolverAware.class);
6、ignoreDependencyInterface(ResourceLoaderAware.class) 资源加载器
7、ignoreDependencyInterface(ApplicationEventPublisherAware.class) 事件发布器
8、ignoreDependencyInterface(MessageSourceAware.class) 消息资源
9、ignoreDependencyInterface(ApplicationContextAware.class) 应用上下文
10、addBeanPostProcessor(new ApplicationListenerDetector(this)) 增加bean后置处理器
3、prepareBeanFactory bean工厂初始化,设置相关属性
4、postProcessBeanFactory 空实现,扩展点
ConfigurationClassPostProcessor
BeanDefinitionRegistryPostProcessor 实现了bean的动态注入,新增额外的注册解析。 最先执行
1、invokeBeanDefinitionRegistryPostProcessors
PlaceholderConfigurerSupport ,解析$符号,${person.age}
PropertyOverrideConfigurer
CustomEditorConfigurer 自定义属性解析器
BeanFactoryPostProcessor 通过获取beanFactory可以修改beanFactory中的bean信息,如修改bean的属性值、实现bean的动态代理
2、invokeBeanFactoryPostProcessors
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
5、invokeBeanFactoryPostProcessors 执行beanFactory的后置处理器,扩展点
PostProcessorRegistrationDelegate.registerBeanPostProcessors
6、registerBeanPostProcessors 注册所有BeanPostProcessors,getBean时会调用
7、initMessageSource 初始化消息源
SimpleApplicationEventMulticaster.multicastEvent
ApplicationEventMulticaster
8、initApplicationEventMulticaster 初始化事件派发器,用来发布事件
9、onRefresh SpringBoot也是在该步骤中启动内嵌Tomcat容器的
1、AbstractApplicationEventMulticaster.addApplicationListener
3、AbstractApplicationEventMulticaster.addApplicationListenerBean
4、getApplicationEventMulticaster().multicastEvent 将事件传递给所有匹配的监听器。
ApplicationEvent 是所有Spring事件的基类
ApplicationListener 是一个泛型接口,用于处理特定类型的事件
ApplicationEventPublisher 是事件发布的核心接口
10、registerListeners 注册监听器
11、finishBeanFactoryInitialization 初始化所有剩余的单实例Bean(没有使用懒加载的Bean).整个Spring IOC的核心
12、finishRefresh 发布事件
AbstractApplicationContext.refresh 刷新bean容器
ClassPathXmlApplicationContext
1、wrapIfNecessary
2、getAdvicesAndAdvisorsForBean 如果存在增强方法则创建代理
aop 创建代理类
3、createProxy 创建代理
AbstractAutoProxyCreator.postProcessAfterInitialization AOP代理生成类
aop调用流程
AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary
AnnotationAwareAspectJAutoProxyCreator
2、namespaceHandler.init() 重要示例AOP标签解析
1、BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors
2、BeanFactoryUtils.beanNamesForTypeIncludingAncestors 获取所有bean name
3、AbstractAspectJAdvisorFactory.isAspect for循环判断,所有bean是否有Aspect注解
getAdvisorMethods
1、AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod
2、aspectJAnnotation.getPointcutExpression() 获取execution
1、getPointcut 获取切点信息
ReflectiveAspectJAdvisorFactory.getAdvice 根据不同的类型获取不同的增强器
instantiateAdvice 初始化
2、InstantiationModelAwarePointcutAdvisorImpl 根据切点信息生成增强类
getAdvisor
4、ReflectiveAspectJAdvisorFactory.getAdvisors 解析标记Aspect注解中的增强方法
findCandidateAdvisors 获取所有增强器
findAdvisorsThatCanApply 寻找增强器中适用于当前class的增强器
getAdvicesAndAdvisorsForBean 如果存在增强方法则创建代理
2、getAdvicesAndAdvisorsForBean 如果存在增强方法则创建代理
proxyFactory.addAdvisors 加入增强器
ProxyCreatorSupport.createAopProxy 获取AOP代理,默认为JDK动态代理
createAopProxy().getProxy(classLoader) 真正创建代理的方法
createProxy
1、invokeJoinpoint() 如果所有interceptor执行完了,执行被代理方法
2、dm.interceptor.invoke(this) 如果interceptor没有执行完,执行AOP增强方法
3、((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this); 如果Interceptor不是PointCut类型(不是AOP),就直接执行Interceptor里面的增强
ReflectiveMethodInvocation.proceed
aop 目标方法和增强方法的执行
Spring aop源码解析
1、registerTransactionAspect mode=\"aspectj\"
1、AopNamespaceUtils.registerAutoProxyCreatorIfNecessary
2、创建AnnotationTransactionAttributeSource类型的Bean
3、创建TransactionInterceptor类型的Bean
4、创建BeanFactoryTransactionAttributeSourceAdvisor类型的Bean
5、将上面AnnotationTransactionAttributeSource类型Bean注入进上面的Advisor
6、将上面TransactionInterceptor类型Bean注入进上面的Advisor
7、将上面三个Bean注册进IOC中
2、AopAutoProxyConfigurer.configureAutoProxyCreator mode=\"proxy\"
1、getTransactionAttribute
2、computeTransactionAttribute
3、findTransactionAttribute
SpringTransactionAnnotationParser
4、TransactionAttribute.parseTransactionAnnotation 解析Transactional注解
AbstractFallbackTransactionAttributeSource.
3、TransactionAttributeSourcePointcut
1、AnnotationDrivenBeanDefinitionParser.parse() 事务注解解析
Spring @Transactional注解的声明式事物介绍
1、metadata.getAnnotationAttributes(Configuration.class.getName())
isConfigurationCandidate
1、ConfigurationClassUtils.checkConfigurationClassCandidate 判断是否有@Configuration注解
2、configCandidates.sort 多个Java配置类,按@Ordered注解排序
1、processMemberClasses 递归处理任何成员(嵌套)类
2、processPropertySource 解析@PropertySource注解
3、this.conditionEvaluator.shouldSkip 解析@Conditional注解
1、添加filter
scanCandidateComponents
isCandidateComponent 按照scanner过滤器过滤,比如配置类本身将被过滤掉,没有@Component等组件注解的类将过滤掉
1、findCandidateComponents(basePackage) //根据basePackage加载包下所有java文件,并扫描出所有bean组件
2、this.scopeMetadataResolver.resolveScopeMetadata 解析@Scope作用域
2、scanner.doScan
4、componentScanParser.parse 解析@CmponentScan注解
5、processImports 解析@Import注解
6、configClass.addImportedResource 解析@ImportResource注解
7、retrieveBeanMethodMetadata 处理@Bean注解
8、processInterfaces 处理接口中所有添加@Bean注解的方法
doProcessConfigurationClass
3、ConfigurationClassParser.parse 解析@Congiguration配置类
4、this.reader.loadBeanDefinitions 加载bean定义信息
Spring @Configuration、@Bean等常用注解源码解析
NamespaceHandler spring注册解析器,例如AOP、MVC等
0 条评论
回复 删除
下一页