2021.07-spring启动源码分析
2021-07-01 16:01:01 0 举报
spring启动流程,持续更新中,目前更新一半
作者其他创作
大纲/内容
InitializingBean.afterPropertiesSet
MergedBeanDefinitionPostProcessor
PostProcessorRegistrationDelegate$BeanPostProcessorChecker
调用getParameterNames
依次处理所有的注解并包装为ConfigrationClass
this.advice.afterReturning()
doRegisterBean
生成Advisor的子类包装类InstantiationModelAwarePointcutAdvisorImpl类包含了方法基本信息、实例化后的Advice、Pointcut等等
beanFactory
initApplicationEventMulticaster
实例化
customizeBeanFactory
resolveRequiredPlaceholders
AspectJAfterThrowingAdvice
AnnotationAwareAspectJAutoProxyCreator
prepareBeanFactory
findCandidateComponents
prepareRefresh()
advice instanceof AfterReturningAdvice
@Resource
findEligibleAdvisors
AtAfterThrowing AfterThrowing
registry.registerBeanDefinition
Named
super.findCandidateAdvisors()
invokeAdviceMethod
TransactionInterceptor
refreshBeanFactory()
ASPECTJ
instantiateClass
初始化getBean()
propertyResolver.getPropertyAsRawString()
遍历所有的文档节点,逐个解析
bindExplicitArguments
extendAdvisors
DestructionAwareBeanPostProcessor
ObjenesisCglibAopProxy
shouldSkip
循环所有bean包含Aspect注解并且无成员变量不以ajc$命名
autowireByName
AOP核心源码解析AnnotationAwareAspectJAutoProxyCreator
JdkDynamicAopProxy
loadBeanDefinitions
isTypeMatch
createBeanFactory()
getCallbacks
doResolvePlaceholders
BeanMethod
ApplicationContextAwareProcessor
this.advice.before
candidate.isAssignable(ImportBeanDefinitionRegistrar.class)
返回创建的代理对象
返回下一步准备
<beans>标签处理
TransactionManagementConfigurationSelector
findParserForElement
代理生成Class
getBeanPostProcessorCache()
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
createReaderContext
ApplicationListenerDetector.postProcessMergedBeanDefinition
scope
核心处理流程
localPropertySource=PropertySourcesPropertyResolver
getBeanNamesForType
parse
register()
AspectJProxyUtils.makeAdvisorChainAspectJCapableIfNecessary
ImportAware
loadBeanDefinitionsFromRegistrars
AtAfter After
DependencyDescriptor
advice instanceof ThrowsAdvice
afterPrototypeCreation
xml模式时生效
invokeInitMethods
aspectJAnnotation.getAnnotationType()根据类型,
循环ConfigurationClass调用loadBeanDefinitionsForConfigurationClass
isPrototype()原型模式
CglibAopProxy$HashCodeInterceptor
基础结构类包括font color=\"#ffffff\
resolve();
preInstantiateSingletons
StandardEnvironment
调用切面方法invokeAdviceMethod
2
ConfigurationClassPostProcessor
AutowiredFieldElement.inject
Collection
createDelegateBean
CommonAnnotationBeanPostProcessor.postProcessProperties
AspectJAfterAdvice
invokeBeanFactoryPostProcessors
registerBeanDefinitions
AutoProxyRegistrar.classProxyTransactionManagementConfiguration.class
解析
AutowiredAnnotationBeanPostProcessor
ObjectFactory
AbstractXmlApplicationContext
AspectJAroundAdvice
wrapIfNecessary
applyBeanPostProcessorsBeforeInitialization
@Import
isInfrastructureClass() || shouldSkip()
CglibAopProxy$SerializableNoOp
DefaultListableBeanFactory
PropertySouresPlaceholderConfigurer属性处理类
CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition
注解方式启动AnnotationConfigApplicationContext
生成
初始化
populateBean
<alias>标签处理
getBean()
CglibAopProxy$AdvisedDispatcher
asSourceClasses
getPointcut
path
proxyFactory.getProxy()
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
if (sharedInstance != null && args == null)
DefaultEventListenerFactory
resolvePath
configClass.addImportBeanDefinitionRegistrar
applyBeanPostProcessorsAfterInitialization
Object
AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition
ParserStrategyUtils.invokeAwareMethods
调用刷新接口
包装为Set
resolveBeanClass
InfrastructureAdvisorAutoProxyCreator.class
invoke
mi.proceed()
setResourceLoader
返回代理对象
processImports
componentClasses
createProxy
resolveRequiredPlaceholders()
onRefresh
GroovyBeanDefinitionReader
父类实例化
包装为RootBeanDefinition
请求调用
preProcessXml(root);font color=\"#f44336\
getBeanPostProcessors()
如果非延迟,实例化Advice
beforePrototypeCreation
AnnotationBeanNameGenerator
initDefaults
CommonAnnotationBeanPostProcessor
List<Advisor>
PropertyPlaceholderHelper
返回chain
调用
CglibAopProxy$StaticUnadvisedInterceptor
.buildAspectJAdvisors()
1.PriorityOrdered2.Ordered3.nonOrdered
BeanPostProcessor.postProcessAfterInitialization
CglibAopProxy$EqualsInterceptor
springAdvice处理参数绑定
AnnotationScopeMetadataResolver
applyBeanPostProcessorsBeforeInstantiation
父类ProxyCreatorSupport
AspectJAutoProxyRegistrar
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary
模板方法
findCandidateAdvisors
前置方法
@Controller
@ComponentScan
Field.set
设置回调到代理对象
1
对类判断
advice内部
InstantiationAwareBeanPostProcessor
BeanDefinitionHolder
resolveCandidate
自定义BeanDefinitionParser
AtBefore Before
成员变量初始化
DefaultNamespaceHandlerResolver
mi.proceed(),mi就= ReflectiveMethodInvocation
advisorsCache
finishBeanFactoryInitialization
省略
advisors=buildAdvisors
isInfrastructureClass
AspectJJtaTransactionManagementConfiguration.classAspectJTransactionManagementConfiguration.class
createBeanInstance
@PostConstruct
List
加载所有的目录包含Jar下的META-INF/spring.handlers文件涉及到xml配置文件的解析,都需要使用这种方式;
@Value
put到缓存(bean是单利才可以)
StreamDependencyDescriptor
循环类中所有方法,但不包含PointCut注解方法
isFactoryBean
new PropertySourcesPropertyResolver(propertySources)
xml配置方式启动ClassPathXmlApplicationContext
@ImportResource
default methods on interfaces
jdk
(advice instanceof MethodBeforeAdvice)
@Bean
ComponentScanAnnotationParser.parse
包装为Advisor
JDK方式创建代理
parserContext.getRegistry().registerBeanDefinition
生成DefaultListableBeanFactory
getParameterNames
new ProxyFactory()
ConfigurationClassParserspan style=\
createAopProxy()
MethodBeforeAdviceInterceptor
postProcessAfterInitialization
doResolveDependency
getOrCreateEnvironment
registerBeanDefinition
NamespaceHandler.init()
BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry
AspectJAfterReturningAdvice
invokeBeanDefinitionRegistryPostProcessors
this.reader =new AnnotatedBeanDefinitionReader
InstantiationAwareBeanPostProcessor.postProcessProperties
@Autowired
BeanClassLoaderAware
propertySources.addLast(localPropertySource)
AtAround Around
getEnvironment()
delegate.parseCustomElement
DefinitionParserDelegate
包装并填充ConfigurationClassBeanDefinition
处理属性
返回Advice的子类springAdvice
后置方法
EventListenerMethodProcessor
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition
ExposeInvocationInterceptor.ADVISOR
注册class
createPlaceholderHelper
helper.replacePlaceholders()
ApplicationContextAware
getAdvicesAndAdvisorsForBean
InfrastructureAdvisorAutoProxyCreator
DefaultListableBeanFactory.findAutowireCandidates
通过@Bean
1.忽略依赖2.注册依赖3.注册 ApplicationListenerDetector4.注册Environment、SystemProperties、SystemEnvironment
@Component
是否启用代理
调用后会返回List
getSingleton
引用上面
注册
BeanPostProcessor.postProcessBeforeInitialization
doGetBeanNamesForType
registerDisposableBeanIfNecessary
getSingleton( createBean())
AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod查找方法上AOP注解,并会将注解的信息包装为AspectJAnnotationfont color=\"#ffffff\
AtPointcut Pointcut
registerDefaultFilters
beanFactory.addBeanPostProcessor(postProcessor)
doRegisterBeanDefinitions
value
为Aspect添加特殊的AdviceAspectJAwareAdvisorAutoProxyCreator.extendAdvisors
JDK动态代理创建并封装ReflectiveMethodInvocation对象然后调用它的proceed()方法
getImportBeanDefinitionRegistrars
ExposeInvocationInterceptor
导入Class类包装为AnnotatedGenericBeanDefinition
快速检查
resolveExpression
isEagerInit
填充对象
@PropertySource
Method
setEnvironment
isSingleton()单例模式
AopConfigUtils.registerAutoProxyCreatorIfNecessary
BeanUtils.instantiateClass
AutoProxyRegistrar
setCallbacks(callbacks)
BeanFactoryTransactionAttributeSourceAdvisor
scope.get()其他模式
mi.proceed(),mi=CglibMethodInvocation
refresh()
BeanNameAware
JdkDynamicAopProxy.invoke
registerOrEscalateApcAsRequired
obtainFreshBeanFactory()生成BeanFactory
CglibAopProxy$DynamicAdvisedInterceptor
@Inject
BeanFactoryPostProcessor.postProcessBeanFactory
ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
AnnotationTransactionAttributeSource
@Repository
getAdvisor
Advice.invoke(MethodInvocation)
@WebServiceRef
objenesis.newInstance()
获取Advice
构造
放大效果
生成CGlib的默认代理回调对象,在调用Bean的时候,会先依次调用回调对象
SmartInitializingSingleton.afterSingletonsInstantiated
ProxyTransactionManagementConfiguration
根据Bean的自动装配类型,确实Bean是否还有依赖Bean
loadBeanDefinitionsForBeanMethod
ImportSelector.class
细节省略
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve();
getAdvisors
@Service
findAdvisorsThatCanApply
返回值作为下次的Source
spring cglib
默认的BeanPostProcessor
AtAfterReturning AfterReturning
postProcessBeforeInstantiation
isArray
每次执行的时候currentInterceptorIndex都要加1,相当于执行下一个AdviceObject interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
createProxyClassAndInstance
<bean>标签处理
instantiateUsingFactoryMethod
getHandlerMappings
ImportBeanDefinitionRegistrar.registerBeanDefinitions
ApplicationListenerDetector
生成默认的NamespaceHandlerResolver
EmbeddedValueResolverAware
getObjectForBeanInstance
registerAnnotationConfigProcessors
postProcessBeanFactory
InstantiationAwareBeanPostProcessor.postProcessPropertyValues
调用切面方法
createBean()
createBeanDefinitionDocumentReader
ResourceLoaderAware
InitDestroyAnnotationBeanPostProcessor
CglibAopProxy$StaticDispatcher
@PreDestroy
doLoadBeanDefinitions
ApplicationEventPublisherAware
@Bean属性解析
new
Proxy.newProxyInstance
代理实例化
setBeanClassLoader
new DefaultAopProxyFactory()
parseBeanDefinitions
AOP的启动入口,前提EnableAspectJAutoProxy注解
所有Bean匹配
registerBeanPostProcessors
CGLib动态代理创建并封装CglibMethodInvocation对象然后调用它的proceed()方法
代理方式
AbstractAutowireCapableBeanFactory
processMemberClasses处理@Component注解的类
在这里创建代理。抑制不必要的默认目标bean实例化:TargetSource将以定制方式处理目标实例。 目标不为空执行如下步骤
AopProxy
doScan
CGLib方式创建
setConfigLocations
parseStringValue
calculateArgumentBindings
findAspectJAnnotationOnMethod
ImportSelector
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying
registerListeners
doGetBean()
initializeBean
包装为AspectJAnnotation
初始化默认值
包装为AspectJExpressionPointcut
createAopProxy().getProxy(classLoader)
doCreateBean
createInstance
添加到默认的发现addDiscoverer
必须带有@Conditional注解
autowireByType
beanNamesForTypeIncludingAncestors
currentInterceptorIndex为chain.size-1 的时候
getCustomTargetSource
registerPostProcessor
<import>标签处理
propertySources = new MutablePropertySources()propertyResolver = new PropertySourcesPropertyResolver(this.propertySources)
createParameterNameDiscoverer
selector.selectImports
做准备
BeanFactoryAware
resolveBeforeInstantiation
SmartInstantiationAwareBeanPostProcessor
processCommonDefinitionAnnotations
AnnotationConfigUtils
查找spring中已经存在的Advisor
创建定制目标
doProcessProperties
InjectionMetadata.inject
invokeAwareMethods
getProxy
MessageSourceAware
ClassPathBeanDefinitionScanner.doScan()
AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod
applyPropertyValues
superclass
List<Advisor>
AspectJMethodBeforeAdvice
if postProcessed
getAdvice()
getBean
AutowiredAnnotationBeanPostProcessor.postProcessProperties
ConditionEvaluator
loadClass
instantiateBean
BeanDefinition包装为
ThrowsAdviceInterceptor
CglibMethodInvocation.proceed()
AfterReturningAdviceInterceptor
DefaultParameterNameDiscoverer
AspectJAnnotation
findResourceMetadata
setBeanFactory
添加原List中首位并返回
DefaultAdvisorAdapterRegistry()
registerDependentBean
instantiateAdvice
processProperties(propertySources)
创建aop的发现
getDependsOn()
documentReader.registerBeanDefinitions
getBeanPostProcessors
new XmlReaderContext
回调设置
this.reader.register
bean 类是否表示不应被代理的基础结构类
DefaultBeanDefinitionDocumentReader
EnvironmentAware
getInitMethod
handler.parse
3
XmlBeanDefinitionReader
reader.loadBeanDefinitions
Enhancer
applyMergedBeanDefinitionPostProcessors()允许后处理器修改合并的bean定义
doLoadDocument
bindArgumentsByName
设置占位符setPlaceholderPrefixsetPlaceholderSuffixsetValueSeparator
initMessageSource
List<Object> chain=getInterceptorsAndDynamicInterceptionAdvice
执行代理方法invokeJoinpoint()
pointcut
AspectJAdviceParameterNameDiscoverer
resolvePreparedArguments
扩展Advice
添加List中
namespaceUri
调用共用方法
sharedInstance=getSingleton()
ReflectiveMethodInvocation.proceed()
resolveDependency
findAutowiringMetadata
getBeanFactory()
按照顺序注册
getAopProxyFactory().createAopProxy如果是接口或者Proxy子类
invokeCustomInitMethod
默认初始化方法
BeanPostProcessorChecker
candidate.isAssignable(ImportSelector.class)
添加销毁设置
getNamespaceHandlerResolver()
模板方法子类实现
postProcessProperties返回空才调用postProcessPropertyValues
createDefaultNamespaceHandlerResolver()
autowireConstructor
获取所有beanthis.beanDefinitionNames
super.proceed()
DisposableBean
ManagedBean
resolveMultipleBeans
finishRefresh
Advice
propertySources=MutablePropertySources
initBeanDefinitionReader
propertyResolver
loadBeanDefinitionsFromImportedResources
enhancer.createClass()
调用NamespaceHandler的init()方法
parseDefaultElement
JDK PROXY
循环
初始化这个NamespaceHandler子类
包装为ConfigurationClassParser对象并调用.parse(),解析所有Configration类
Map
instanceof InitializingBean)
registerDestructionCallback
ImportBeanDefinitionRegistrar.class
循环所有Advisor,通过相应的Advisor获取对应的Interceptor,包含两种方式:1.advisor.getAdvice(),2.adapter.getInterceptor用于后面的调用触发;每个Interceptor都保存对应的Advice关系
this.reader.loadBeanDefinitions()reader=ConfigurationClassBeanDefinitionReader
收藏
收藏
0 条评论
回复 删除
下一页