spring-全景
2023-05-19 17:06:50 3 举报
spring-全景
作者其他创作
大纲/内容
是
直接开始创建
parseCustomElement使用额外的方式进行解析
此方法开始进行对象的创建,包含了实例化,初始化,循环依赖,AOP等核心逻辑的处理过程。此步骤是最核心的关键点
是否为空
有
执行后续的处理逻辑
在填充属性中会涉及到循环依赖
invokeJoinpoint
执行处理操作
1.销毁前面过程中创建的bean对象
分别获取name和value对象
通过BeanPostProcessor来获取构造器或者通过选择最合适的构造器
BeanDefinitions
通过scope来获取具体的作用域,来创建对象
看到的是反编译之后的字节码文件没有调用任何方法,执行的都是DynamicAdivsedInterceptor对象
挂起空事务
三级缓存
EmbeddedValueResolverAware
开始拦截器链返回
获取默认的构造方法来进行实例化操作
否
完成其他aware接口的子类设置工作
是否实现了InstantiationAwareBeanPostProcessor
返回
9.onRefresh()spring中没有任何实现
pip.proceed(args)pjp对象中包含了cglibMethodInvocation对象,所以在进行调用的时候,能够回到拦截器链中继续向下执行
doBegin()开启事务
父容器不等于空,且BeanDefinitionMap不存在当前bean
BeanFactoryPostProcessor
通过factorymethod生成具体得到对象并且返回
ClassPathXmlApplicationContext,FileSystemApplication,实例化策略(simple、cglib)
判断一级缓存中是否存在
通过类型注入
直接调用afterPropertiesSet方法设置属性
ConfigurationClassPostProcessor
执行后置处理逻辑
postProcessBeanFactory、OnRefresh、InitPropertySource
事务的创建提交与回滚流程
transformedBeanName转换bean的名称
直接调用父容器的getBean来获取对象
最终都会调用handler.parse()方法去解析不同的标签
不是
获取容器中实现了BeanPostProcessor接口的名称
5.invokeBeanFactoryPostProcessor执行BeanFactoryPostProcess
finallycleanupTransactionInfo清除事务信息
以当前事务状态继续运行
使用cglib、jdb进行动态代理
preInstantiateSingletons开始对象的实例化
对象为空,且允许早期引用
生成的完整对象进行返回操作
invokeInitMethod执行初始化方法
先从一级缓存中获取对象
NullBean
BeanFactory,ProxyFactory
一些其他的BPP
freezeConfiguaretions()冻结BeanDefinition,不允许再修改BeanDefinition了
getBean()获取对象
expoedInvocationInterceptor
直接调用createBean()
proceed()实际调用的是CglibMethodInvocation父类(ReflectiveMethodInvocation)的方法,然后从拦截器链中根据下标依次获取到每一个元素来进行相关的处理
TransactionSynchronizationManager.getResource()通过此对象来获取连接持有器,在第一次调用的时候,对象一订为空。后续创建完成之后会进行设置工作
addEmbeddedValueResolver设置内置的值处理器
直接返回单例对象即可
获取5号位置的元素Before
txAttr事务对象不为空 且 具体的方法名称不为空
通知的时候有AdvisorAdapter
根据beanName来获取完整的BeanDefinition对象,而且是RootBeanDefinition
从一、二、三级缓存中判断是否有此对象
resolveBeforeInstantiation()给BeanPostProcessor(InstantiationAwareBeanPostProcessor)一个机会,生成一个对象。可以生成代理类
doCreateBean()
获取BeanDefinition对象,并且进行检查操作
设置配置文件路径到当前应用程序中。(比如配置文件的路径可能包含一些占位符或环境变量)setConfigLocations(configLocations)
BeanDefinitionBulider
这中间可以拿到被代理对象调用方法的返回值,可以修改
12.finishRefresh()完成刷新
等所有Bean都创建完后,会通过beanName获取容器中所有的bean对象
1. 设置容器的启动时间。2. 设置活跃状态为true。3. 设置关闭状态为false。4. 获取Environment对象(环境对象),并加载到当前系统的属性值到Environment对象中。5. 准备监听器和事件的集合对象,默认为空集合(Springboot会使用这个)
如果包含aop的相关处理,那么会在此处生成Advisor对象,方便后续进行调用
ManagedMap
先获取0号位置的元素exposedInvocationInterceptor
创建一个空的list集合,存放,用来存放BeanDefinition
对象中包含了保存点,连接持有器等相关信息
没有
addSingleFactory向三级缓存中添加beanName和lambda表达式
不存在
3.处理用户传进来的自定义的BPFF
DataSourceTransactionObject创建数据源事务对象
去spring.handlers文件里面查找
RuntimeBeanReference
2.重置当前容器的状态标志
BeanFactory
是否需要立即被加载
AspectJAwareAdvisorAutoProxyCreator
策略模式
addSingleton将生成的完整对象设置到一级缓存中
判断当前beanFactory是否是BeanDefinitionRegistry
单例模式
ApplicationListenerDetector
解析@Componentscan包含的属性值
invocation.proceedWithInvocation()执行方法的具体处理逻辑
BeaDefinitionRegistryPostProcessor
ConfigurationClassPostProcessor执行操作
不同的标签有不同的处理类,但是最终都会获取到完整的BeanDefintion对象
原型模式
initalizaBean完成当前bean的初始化操作
先创建一个XmlBeanDefinitionReader
在构造方法里面只是把配置文件的路径变成了字符串数组string[],还没有变成Resource对象把字符串变成Resource对象
BeanDefinitionVisitor
是否有
抛出异常
责任链
这些可以在AnnotationConfigUtils和AopConfigUtils类里面看
getInterceptorsAndDynamicInterceptionAdvice获取整个消息通知的责任链,安装链式结构一次调用执行
AsprctJAfterReturningAdvice
进行封装到一个委托对象中
AsprctJAroundAdvice
getTransactionAttribute()获取某一个方法对应的具体的事务属性等相关信息
定义bean的时候必须要有property标签来完成解析工作(配置文件)
aop
挂起当前事务
事务依赖于AOP
4.postProcessBeanFactory默认没有实现,留给子类进行实现
二级缓存
监听器、监听事件、广播器
autowireByName方法完成注入
在业务流程执行之前执行Around的前置逻辑invokeAdviceMethod
RuntimeBeanNameReference
直接跳过
验证访问修饰符
ApplicationContextAwareProcessor
调用父类的构造方法创建PathMathingResourcePatternResolver(只是创建对象,没有进行解析):解析配置文件用的对象
创建空事务
13.resetCommonCache()情况运行过程中产生的缓存
ManagedProperties
MessageSourceAware
autowireByType完成注入
BeanFactoryAware
AutowiredAnnotationBeanPostProcessor
判断BD是否是非抽象的&& 是否是单例的 && 且是非懒加载的
判断传播特性是否是required new
postProcessBeanDefinitionRegistry()
spring中所有的bean对象都是单例的
模式判断
获取1号位置的AfterThrowing元素
获取2号位置的AfterReturning元素
从集合中获取每一个元素来进行对象的创建
resolvableDependcies一些依赖关系集合
调用createBean创建对象
PropertyEditor属性编辑器,可以解析Bean并对里面的值个性化赋值
prepareTransactionInfo创建事务信息对象,包含了事务处理过程中的相关属性值
ExpressionResolverSpring的EL表达式解析器
直接返回对象
满足
判断bean是否实现了SmartInitializingSingleton接口
一级缓存中没有,且当前对象正在被创建过程中
获取当前容器的父容器
如果运行过程中出现异常情况
获取3号位置的元素After
BeanWrapper
调用该bean的afterSingletonsInstantiated方法来完成对象属性的设置工作
以当前的事务状态继续下去
解析@Import
实现子类
拦截器链中包含多少个对象由之前定义的消息通知来决定,如果全部定义的话,包含6个
11.finishBeanFactoryInitialization完成所有的非懒加载的单例对象的实例化操作
通过名称注入
可以自由扩展,修改beanFactory中的相关信息,但是使用最多的是对BeanDefinition的修改操作
6.注册BeanPostProcessorregisterBeanPostProcessor(beanFactory)
创建当前bean的包装对象,默认为空
什么处理工作都不做,直接向下执行,获取下一个元素,因为AfterThrowing对应的是程序执行过程中出现的异常情况,此时还没有执行任何业务代码,所以直接跳过
processConfigurationClass开始进行各个注解的解析工作
开始执行Around消息通知的执行逻辑
BeanClassLoader类加载器
调用ObjectFactory的getObject()方法来创建对象
创建两个空的Set集合对象,用户进行去重操作。分别存放配置类和已经解析过的配置类
解析@ComponentScan
processConfigBeanDefinfitions(registry)处理配置类的解析信息
实现具体的业务逻辑的时候,是否有异常情况
BD不等于空 且 包含了init-method
ManagedSet
有一堆的inter的内部对象,大部分跟注解相关
如果BD不为空,且Synthetic不为true
7.initMessageSource进行国际化相关操作
实现接口
autowireConstructor通过此方法来生成对象,并且返回
返回空对象
BeanNameAware
intercept()开始执行具体的流程
判断当前事务的传播特性是否是PROPAGATION_MANDATORY
createTransactionIfNecessary()开始创建事务
开启事务
...
调用postProcessorProperties的方法来进行属性值的设置
设置保存点
异常
当前BD中是否包含propertyValue对象
invokeAdviceMethodWithGivenArgs
判断传播特性是否是nested
不满足
工厂模式
完成spring自带或者用户自定义的BeanPostProcessor的解析
忽略
此处会判断是否要完成某些内部的bean的BeanDefintion的加载
开始进入容器的创建和刷新环节 refresh()
当前对象是否是单例对象 && 是否允许循环依赖 && 当前对象是否正在被创建过程中
2.obtainFreshBeanFactory创建容器,并且完成配置文件的加载
registerBeanPostProcessor(beanFactry)
beanWrapper是否等于空
初始化当前的bean包装类,添加bean对象到当前的bean包装类中
设置自动提交关闭
什么处理工作都不做,直接在正常的业务逻辑执行完成之后再进行调用
从容器中获取所有的BeanDefinitionNames的集合
doLoadBeanDefinitions实际解析文件的工作
判断是否有依赖的对象
resolveReference
把当前对象设置到ThreadLocal遍历中,方便在链中直接进行获取,并根据原来的下标依次获取元素
获取当前bean的构造方法来生成具体的对象
判断当前对象是否是新添加的对象
是否是默认的标签(bean标签)
加载配置文件:loadBeanDefinitions()
此时链上的所有拦截器都已经执行完毕,该执行具体的方法逻辑了(被代理对象的具体方法)
执行前置逻辑
判断是否有异常情况
对实现了FactoryBean接口的子类来进行调用和处理工作
创建新事物的状态对象
doLoadDocument将配置文件解析成稳定对象,方便通过父子节点的方式获取出对应的标签元素
Spring中的一些设计模式
执行init-method
10.registerListeners注册监听器,为了方便接受广播的事件
清空二三级缓存中存在的这个对象
获取代理对象,并且执行对象的方法来进行处理
4.获取当前容器中所有实现了BDRPP接口的对象,根据实现了PriorityOrdered、Order、没实现这两个接口的对象进行排序执行postProcessBeanDefinitionRegistry方法
开启一个新的事务开始执行
ConfigurationPostProcessor
从容器中获取到所以的BeanDefinitionName
EventListenerMethodProcessor
存在
对象不为null 且参数为空
获取bean对象的Class对象
递归处理成员嵌套类
resolveValueIfNecessary调用此方法来完成value的值解析工作
标记当前对象要开始被创建了
注册到当前容器中
parseDefaultElement使用默认的方式进行解析
AsprctJMethodBeforeAdvice
有这个属性就抛异常,因为当前对象是空,怎么可能有属性的赋值
InstantiationAwareBeanPostProcessor有两个方法是实例化前后调用的方法
解析@PropertySource
getSingleton()
最后添加一个ImportAwareBeanPostProcessor的BeanPostProcessor
AbstractAutoProxyCreator
applyMergedBeanDefinitionPostProcessors执行MergedBeanDefinitionPostProcessors
实际的before的消息通知
populateBean()填充属性
是否符合规则的配置类
获取4号位置的元素Around
txAttr不为空且 事务管理器不为空
判断事务的传播特性是否是Never
给Bean对象设置属性值
parseBeanDefinitions解析BeanDefinition
只是在某个集合中添加这个对象即可。alreadyCreated集合
CommonAnnotationBeanPostProsscessorInitDestroyAnnotationBeanPostProcessor解析 @PostConstruct @PreDestroy @Resource注解
执行postProcessBeanFactory()
解析两类标签1.bean标签2.其他标签(包括自定义标签)
判断BD的Synthetic是否为true && 是否包含InstantiationAwareBeanPostProcessor
判断事务的传播特性是否是not supportted
populateBean完成属性的填充工作
3.prepareBeanFactory给容器对象完成属性的赋值操作
同时满足
以非事务状态开始运行
EnvironmentAware
BeanDefinition
判断是否是原型作用域对象
什么操作都不做,再正常的业务逻辑执行之后再进行调用处理
在创建代理对象的过程中,是通过wrapIfNecessar方法来创建对象的
根据&+beanName去获取对象
doRegisterBeanDefinition实际解析注册的操作
8.initApplicationEventMulticaster()初始化事件广播器
根据当前标签的空间命名字符串去查找对应的handler处理类
设置事务属性
进行类型转换,执行BeanDefinitionRegisterPostProcessor接口中的方法:postProcessBeanDefinitionRegistry
在prepareBeanFactory中添加了BPP
applyBeanPostProcessorsAfterInitialization循环调用BeanPostProcessor来完成after方法的调用
对PropertyValues进行一系列的验证工作
使用AOP再进行通知调用的时候,会使用到责任链模式
3.抛出异常
执行around的后置处理
返回创建好的集合对象beanDefinition
装饰者模式
1.prepareRefresh()容器刷新前的准备工作
经常用到的BeanPostProcessor
开始对象的创建
一级缓存
isExistingTransaction判断是否已经存在一个事务
从集合中循环判断每一个对象
ignoreDependdencyInterfaces集合一堆ignore,忽略某些Aware的类
completeTransactionAfterThrowing完成当前事务的回滚
determineTransactionManger()获取事务管理器
applyBeanPostProcessorsBeforeInitialization循环调用BeanPostProcessor来完成before方法的调用
BeanDefinitionNames存放beanDeginition的名称集合
prepareMethodOverrides()用来判断对象是否包含lookup-method、replace-method标签(配置文件中可以指定这两个属性),会发生替换bean对象的操作
是否包含factorymethod(这个BD是否是FactoryBean)
invokeAdviceMethod
验证当前存在的事务
当前对象是否在创建过程中
为了解析@Bean的单例问题:会再@Bean方法执行前做一个判断,是否在Spring容器里面存在,如果存在就不生成了
抛异常
invokeAwareMethods抵用aware接口相关的方法设置容器属性
注册到BeanFactory容器里面的BeanDefinitionMap和BeanDefinitionNames中
获取PropertyValue的自动注入模式
开始循环判断
完成整个容器的启动,所有的对象都准备完成。清除上下文缓存。初始化生命周期处理器。发送刷新完成事件
模板方法
创建配置类解析器configurationCLassParser
是否实现了InitializingBean接口
获取数据库连接
getTransactionAttributeSource()获取事务方法所对应配置的事务属性集合
直接返回空对象
把bean对象返回回去
这几个都是MergedBeanDefinitionPostProcessors的实现类
applyPropertyValues
返回实际对象
createBean()
构造方法
将解析完成的BeanDefinition对象注册到容器的BeanDefinitionMap和BeanDefinitionNames中
doGetTransaction()获取事务定义信息
便利每一个元素,判断是否是BeanDefinitionRegisterPostProcessor子类
调用jdk或者cglib的方式来生成代理对象
具体的属性值设置
循环遍历集合中所有存在的PropertyValue
解析父类
直接抛出异常
观察者模式
循环依赖
AsprctJAfterAdvice
判断事务的超时属性
this.beanFactory.getBean(resolve)
BeanPostProcessor集合
registerBeanDefinitions解析标签元素并且完成注册功能
在实际的业务逻辑处理之前,先把核心的before中的逻辑给执行了,开始调用MethodBeforeAdvice中的before方法
pvs(PropertyValues)不等于空
这个步骤与解析BeanDefinitionPostProcessor一样,根据Order不同的排序放入集合,只不过这里不执行。只放到容器中
有一个单例对象的双重检查操作,接着从一级开始获取,没有的话从二级开始获取,没有的话从三级缓存中获取。最后返回实际需要的对象(可能为null)
构建者模式
doScan(String...basePackages)
ResourceLoaderAware
CommonAnnotationBeanPostProcessor
适配器
obtainFromSupplier通过supplier创建对象并返回
判断当前对象是否正在被销毁
AsprctJAfterthrowingAdvice
通过默认的构造器来生成
invokeWithTransaction开始事务的处理逻辑
会生成具体对象的代理对象
doProcessConfigurationClass实际解析方法
可以通过作用域的方式来改变bean为prototype
BeanDefinitionMapkey:beanNamevalue:BeanDefinition
ImportAwareBeanPostProcessor
是否是单例对象
Never传播特性不能有事务
直接返回
委托者模式
enhanceConfigurationClasses(beanFactory)对当前的配置类进行增强操作
创建bean容器:createBeanFactory() -> DefaultListableBeanFactory
调用实例化策略来完成实例化
获取当前beanClass对象
1.创建空的集合,用来储存已经执行过的BeanPostProcessor
一系列的invoke方法
ApplicationEventPublisherAware
RootBeanDefinition包含了父类相关信息的对象定义
BeanDefinitionHolder
parser.parse()核心解析流程
解析@Bean
代理模式
验证BD中是否包含Supplier
ManagedArray
commitTransactionAfterReturning以正常的方式提交事务
GenericBeanDefinition通用的对象定义信息
开始处理
ManagedList
使用自动注入的构造器来生成
createBeanInstance创建对象
ApplicationContextAware
上面都没有返回,则使用instanciateBean方法使用默认的方式来进行实例化操作
创建一个空的去重Set集合,用来存放扫描到的类Set<BeanDefinition> candidates = findCandidateComponents(basePackeage)
doGetBean()实际获取对象的操作
DependencyDescriptor
TypedStringValue
AutowiredAnnotationBeanPostProsscessor解析 @Autowired @Value注解
registerDisposableBeanIfNecessary回调,设置需要销毁的对象
从二级缓存中获取
调用InstantiationAwareBeanPostProcessor的实例化之后的方法来进行实例化之后的属性值的设置工作
loadBeanDefinitions
总之,先执行BDRPP的postProcessBeanDefinitionRegistry方法。然后再执行BDRPP的postProcessBeanFactory方法再执行BFPP的postProcessBeanFactory方法
解析@ImportSource
setConversionService()设置类型转换服务
开始调用具体的方法
先创建依赖对象
访问者模式
是否是FactoryBean类型
BeanClassLoaderAware
是,添加进集合
创建CglibMethodInvocation对象
getTransaction()获取事务
0 条评论
下一页