spring全体系图 (3)
2021-10-13 09:08:10 0 举报
spring全体系图 (3)
作者其他创作
大纲/内容
是
3、抛出异常
什么处理工作都不做,直接在正常的业务逻辑执行完成之后再进行调用
获取默认的构造方法来进行实例化操作
addSingletonFactory向三级缓存中添加beanName和lambda表达式
value:BeanDefinition
否
调用此方法afterSingletonsInstantiated来完成bena的处理工作
ResourceLoaderAware
判断bean是否实现了SmartInitializingSingleton接口
getSingleton()
有
先从一级缓存中获取对象
createBean()
getBean()获取对象
如果运行过程中出现异常情况
直接开始创建对象即可
addEmbeddedValueResolver()设置内置的值处理器
ctor.newInstance()
获取当前bean的构造方法来生成具体的对象
是否为空
调用jdk或者cglib的方式来生成代理对象
在填充属性的过程中,会涉及到循环依赖的问题
AspectJMethodBeforeAdvice
4、postProcessBeanFactory默认没有实现,留给子类进行实现操作
mdb不等于空,且包含init-method
经过一系列的invoke方法的执行,调用到业务方法中,然后开始返回
resolveBeforeInstantiation给BeanPostProcessor一个机会返回当前bean的代理对象
applyBeanPostProcessorsBeforeInitialization循环调用BeanPostProcessor来完成before方法的调用
调用ObjectFactory的getObject()方法来创建对象
创建容器对象
BeanFactory
判断是否是原型作用域的对象
有还是没有
没有
完成Bean Definition的加载和解析工作
调用构造方法
直接跳过
2、重置当前容器的状态标志
生成的完整对象进行返回操作
直接调用父容器的getBean来获取对象
applyBeanPostProcessorsAfterInitialization循环调用BeanPostProcessor来完成after方法的调用
ApplicationContextAwareProcessor
exposedInvocationInterceptor
获取bean对象的Class对象
createBeanFactory():DefaultListableBeanFactory
执行异常处理逻辑
ConfigurationClassPostProcessor
使用自动注入的构造器来生成
同时满足
在实际的业务逻辑处理之前,先把核心的before中的逻辑给执行了,开始调用MethodBeforeAdvice中的before方法
addSingleton将生成的完整对象设置到一级缓存中,方便后去来进行获取
intercept()开始执行具体的流程
BeanDefinition
根据beanName来获取完整的BeanDefinition对象,而且是RootBeanDefinition
是否是FactoryBean类型
判断是否是单例对象
如果mbd不为空且Synthetic不为true
抛出异常
完成其他aware接口子类的设置工作
从二级缓存中获取对象
通过factorymethod来生成具体的对象并且返回
直接调用afterPropertiesSet方法来设置属性
autowireConstructor通过此方式来生成对象,并且返回
反射
一级缓存
BeanNameAware
一级缓存中没有且当前对象正在被创建过程中
看到的是反编译之后的字节码文件调用任何方法,执行的都是DynamicAdivsedInterceptor对象
会生成具体对象的代理对象
开始执行Around消息通知的执行逻辑
返回
判断BD是否是非抽象的且是非懒加载的且是单例的
创建当前bean的包装对象,默认为空
验证访问修饰符
根据&+beanName去获取对象
如果包含aop的相关处理,那么会在此处生成Advisor对象,方便后续进行调用
自己完成
在业务流程执行之前先执行around的前置逻辑invokeAdviceMethod
是否实现了InitializingBean接口
调用实例化策略来完成实例化操作
在创建代理对象的过程中,是通过wrapIfNecessar方法来创建对象的,此过程不再赘述
BeanDefinitionMap
invokeAdviceMethod
invokeAwareMethods调用aware接口相关的方法,设置容器属性
invokeInitMethod执行初始化方法
MessageSourceAware
populateBean完成属性的填充工作
instantiateBean使用默认的方式来进行实例化操作
获取4号位置的元素Around
AspectJAfterAdvice
9、onRefresh()
直接调用createBean
1、销毁前面过程中创建的bean对象
beanPostProcessorsBPP集合
直接返回对象即可
从-1的下标位置开始依次获取对应的元素
验证bd中是否包含Supplier
1、先从一级缓存中获取对象
获取当前bean的Class对象
不满足
6、注册BeanPostProcessorregisterBeanPostProcessor(beanFactory)
判断当前对象是否正在被销毁
resolvableDependencies
一系列的invoke方法
什么处理工作都不做,直接向下执行,获取下一个元素,因为afterThrowing对应的时候程序执行过程中出现的异常情况,此时还没有执行任何业务代码,所以直接跳过
是否包含factorymethod
8、initApplicationEventMulticaster()
AspectJAfterReturningAdvice
AspectJAfterthrowingAdvice
从集合中获取每一个元素,来进行对象的创建
ignoredDependencyInterfaces
PropertyEditor属性编辑器
获取BeanDefinition对象并且进行检查操作
开始进行对象的创建
可以自由扩展,修改beanFactory中的相关信息,但是使用最多的是对BeanDefinition的修改操作
直接返回单例对象即可
添加bean对象到当前bean的包装类中,并且进行包装类的初始化操作
把bean对象返回回去
先创建依赖的对象
invokeAdviceMethodWithGivenArgs
11、finishBeanFactoryInitialization(beanFactory)完成所有非懒加载的单例对象的实例化操作
什么操作都不做,在正常的业务逻辑执行之后再进行调用处理
判断当前对象是否是新添加的对象
proceed()实际上调用的是父类的方法(ReflectiveMethodInvocation),然后从拦截器链中中根据下标依次获取到每一个元素来进行相关的处理
transformedBeanName转换bean的名称
判断是否有依赖的对象
preInstantiateSingletons开始对象的实例化
doGetBean实际获取对象的操作
7、initMessageSource
获取2号位置的AfterReturning元素
spring全体系图解
创建Spring应用程序上下文
pupulateBean中有可能会重新调用此方法来创建不同的对象
三级缓存
完成整个容器的启动,所有的对象都准备完成,可以进行后续业务流程的操作,清除上下文缓存,初始化生命周期处理器,发送刷新完成事件
有一个单例对象的双重检查操作,接着从一级开始获取,没有的话从二级获取,没有的话,从三级获取,最终返回实际需要的对象
直接返回空对象
ApplicationContextAware
3、开始进入容器的创建和刷新环节refresh()
详细流程
初始化事件广播器
ApplicationEventPublisherAware
添加到一级缓存中,并且清空二三级缓存
3、prepareBeanFactory给容器对象完成属性的赋值操作
pjp.proceed(args)pjp对象中包含了cglibMethodInvocation对象,所以在进行调用的时候,能够回到拦截器链中继续向下执行
创建CglibMethodInvocation对象
BeanFactoryAware
获取5号位置的元素Before
applyMergedBeanDefinitionPostProcessors
applicationContext
当前bean是否是单例对象,是否允许循环引用,当前对象是否正在被创建过程中
loadBeanDefinitions();加载配置文件
1、设置容器的启动时间2、设置活跃状态为true3、设置关闭状态为false4、获取Environment对象,并加载当前系统的属性值到Environment对象中5、准备监听器和事件的集合对象,默认为空的集合
GenericBeanDefinition通用的对象定义 对象
先获取0号位置的元素exposedInvocationInterceptor
父容器不等于空,且BeanDefinitionMap中不存在当前bean
12、finishRefresh()完成刷新
registerDisposableBeanIfNecessary回调,设置需要销毁的对象
是否需要立即被加载
setConversionService()设置类型转换服务
执行后续的处理逻辑
获取代理对象,并且执行对应的方法来进行处理
ExpressionResolverSPEL表达式的解析器
initializeBean完成当前bean的初始化操作
invokeJoinpoint
判断是否有异常情况
拦截器链中包含多少个对象由之前定义的消息通知来决定,如果全部定义的话,包含的是6个
执行后置的处理逻辑
把当前对象设置到ThreadLocal变量中,方便在链中直接进行获取,并且根据原来的下标依次获取元素
通过BeanPostProcessor来获取构造器或者通过选择最合适的构造器
获取1号位置的AfterThrowing元素
isPrototypeCurrentlyInCreation当前对象是否正在被创建过程中
获取当前容器的父容器
此图中虽然配置了具体的advice的顺序,但是根据你实际的配置情况,顺序可能有所不同,所以要根据你的业务代码来判断具体优先执行哪个
开始调用具体的方法
doCreateBean实际创建对象的方法
从此方法开始进行对象的创建,包含了实例化,初始化,循环依赖,AOP等核心逻辑的处理过程,此步骤是最最核心且关键的点,要对其中的细节最够清楚
EnvironmentAware
createBeanInstance创建对象
通过scope来获取具体的对象,直接创建即可,一般不会走这条路径
实际的before的消息通知
完成spring自带或者用户自定义的BeanPostProcessor的解析
直接返回
getInterceptorsAndDynamicInterceptionAdvice或者整个消息通知的责任链,按照链式结构一次调用执行
5、invokeBeanFactoryPostProcessor执行BFPP接口中的方法
对象不为空且参数为空
13、resetCommonCache()清空运行过程中产生的缓存
注册监听器,为了方便接受广播的事件
从1,2,3级缓存中判断是否有具体的对象
AspectJAroundAdvice
ApplicationContext context = new ClassPathXmlApplicationContext(\"applicationContext.xml\")
RootBeanDefinition包含了父类相关信息的对象定义 对象
1、prepareRefresh()前戏,做容器刷新前的准备工作
freezeConfigurations()冻结BeanDefinition
直接抛出异常
PropertySourcePlaceHolderConfigurer
标记当前对象要开始被创建
执行around的后置逻辑操作
从容器中获取所有的BeanDefinitionNames集合 List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
对象未空切允许早期引用
获取3号位置的元素After
对实现了FactoryBean接口的子类来进行调用和处理工作
obtainFromSupplier通过supplier创建对象并且直接返回
只是在某个集合中添加对象即可alreadyCreated
返回空对象
key:beanName
EmbeddedValueResolverAware
调用init-method来执行
aop
在spring中默认没有任何实现,模板方法,但是在springboot中启动了web容器
BeanDefinitionNames:存放beanDefinition的名称集合
执行前置逻辑
直接返回对象
二级缓存
通过默认的构造器来生成
此时链上的所有拦截器都已经执行完毕,该执行具体的方法逻辑了
当所有的bean对象都创建完毕之后
BeanClassLoaderAware
2、obtainFreshBeanFactory创建容器,并且完成配置文件的加载
2、设置配置文件路径到当前应用程序中
10、registerListeners()
循环遍历所有的beanName,根据beanName获取bean对象
0 条评论
下一页