Spring全体系流程图
2023-03-11 22:54:59 2 举报
不定时更新
作者其他创作
大纲/内容
创建代理中介类,如果目标类有接口使用JDK代理,否则使用CGLib代理createAopProxy
registerListeners
//执行Bean实例化感知后处理器的属性后处理方法postProcessProperties(){ //span style=\
N
根据type从当前容器和父容器中寻找所有的AdvisorName并放入cachedAdvisorBeanNames缓存中
重要实现类AutowiredAnnotationBeanPostProcessor解析@Autowired、@Value注解CommonAnnotationBeanPostProcessor解析@PostConstruct、@PreDestroy、@Resource注解
开始创建对象
handle
容器构造方法1初始化注解bean定义读取器reader(AnnotatedBeanDefinitionReader:注册注释配置类后处理器ConfigurationClassPostProcessor)2初始化bean定义扫描器scanner
为什么不会直接进入我们的业务类?因为在创建类时生成的就是代理类,我们通过getBean()获取到的bean是经过代理后的bean
// 实例化Bean对象createBeanInstance()
createBean()
推断实例化方法:1,Supplier2,FactoryMethod3,@Autowire注解的构造方法4,默认构造方法....
多次重载
重要PostProcessor
// 创建原型对象mbd.isPrototype()
寻找合适的增强对象findEligibleAdvisors
DynamicAdvisedInterceptor.intercept()执行代理方法会进入CglibAOpProxy的静态内部类DynamicAdvisedInterceptor中执行intercept()方法
Registry后处理器方法
由子类负责提供或者生成bean工厂springboot返回创建容器时的默认DefaultListableBeanFactory
执行AOP代理方法
创建web服务器onRefresh
与AOP相同的前置处理
对BeanFactory的属性进行设置设置BeanFactory的类加载器设置EL表达式解析器设置属性类型转换器注册可解析依赖项忽略一些Aware接口(感知器)增加一个BeanPostProcessor(ApplicationListenerDetector()) // 用于监听器探测
AbstractAutoProxyCreator{ postProcessAfterInitialization()}
否
扫描spring.factories文件getSpringFactoriesInstances()
负责解析<import><alias><bean><beans>标签
ClassPathBeanDefinitionScanner扫描器 1:扫描(默认basePackages类的路径) 2:processImports():处理@Import判断是否是需要延迟处理的导入选择器,否的直接调用选择器的selectImports方法,是的话延迟处理(所有的Definition递归parser()再次解析注解,处理到main类的@SpringBootApplication时(里面有import自动装配类AutoConfigurationImportSelector需要延迟处理span style=\
重要处理器
准备上下文:prepareContext()
有
实例化所有剩余的非懒加载Beanspan style=\
Scope:3span style=\
// 使用supplier创建mbd.getInstanceSupplier()obtainFromSupplier()
将DefinitionMap中解析到的BeanPostProcessor实例化,并将所有的bean后处理器根据span style=\
// springboot自动装配方法processConfigBeanDefinitions(){ //判断beanDefinition是否是配置类并进行标记 ConfigurationClassUtils.checkConfigurationClassCandidate(); // 获取Configuration解析器对配置类进行解析,springboot自动配置也在这里解析 // 扫描项目中所有的BeanDefinition ConfigurationClassParser parser = new ConfigurationClassParser(); parser.parse(candidates); //解析parser出来的所有configClasses(例如@Bean的方法) reader = new ConfigurationClassBeanDefinitionReader //加载bean定义并且注册进容器(里面有自动装配的根据@ConditionalOnClass等来判断是否注册) reader.loadBeanDefinitions(configClasses)}
容器里已存在的处理器BeanFactoryPostProcessor:ConfigurationClassPostProcessor(用于@Configuration类的引导处理)。在创建create容器的时候注册进DefinitionMap,在这里getBean的时候会自动实例化
// 提前检查单例缓存中是否已经有注册的单例对象getSingleton(beanName);
parseDefaultElement()
ConfigurationClassParser{ // 对配置类型的BeanDefinition进行处理 parser(Set<BeanDefinitionHolder>){ //扫描main类Scan注解的所有BeanDefinition doProcessConfigurationClass(){ processImports(handle())//保存延迟处理@Imports } } //最后处理延迟选择器ImportSelector(springboot自动配置) this.deferredImportSelectorHandler.process()}
不存在父容器
// 判断Bean是否是实例的、单例的、非懒加载的if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit())
对默认名称空间下的标签和其他名称空间下的标签进行分类解析parseDefaultElement() // 解析默认命名空间下的标签parseCustomElement() // 解析其他标签(自定义标签)自定义标签解析流程1、先读取META-INF/spring.handlers文件 对约束文件进行映射找到自定义名称空 间的解析类 解析类中有init()方法内部包含该名称空间下各个标签的解析类 2、读取META-INF/spring.schemas文件 找到名称空间下对应标签的xsd约束文件 3、读取xsd约束文件 4、自定义标签解析类
进行国际化设置
AbstractAutoProxyCreator
通过反射进行实例化BeanUtils.instantiateClass(constructorToUse)
获取到标签的命名空间->找到自定义标签解析器->进行解析BeanDefinitionParserDelegate{// 解析标签MethodparseCustomElement();}
忽略
无
// 获取当前bean依赖的其他Bean(@DependsOn注解)//并对依赖Bena进行注册(优先实例化font color=\"#000000\
环境env准备好事件通知
// 对Configuration配置类进行增强enhanceConfigurationClasses()
// getImports() 重点方法 在springboot中会调用AutoConfigurationImportSelector实现类的的process方法grouping.getImports().forEach(entry -> { ConfigurationClass configurationClass = this.configurationClasses.get(entry.getMetadata()); 会把找到的ConfigurationClass 继续处理processImports(),如有@import则递归}
spring mvc
根据AdvisorName创建advisor对象
创建容器createApplicationContext()
声明式事务处理
对父容器进行检查
是否使用BeanPostProcessor后置处理器子类:span style=\
AbstractBeanFactory{doGetBean()}
寻找候选的advisorfindCandidateAdvisors
创建代理对象proxyFactory.getProxy()
//默认构造方法instantiateBean()
扫描bean定义
属性填充populateBean()
Bean创建完成
// 判断是否需要立即初始化if (isEagerInit)
执行Bean后置处理器的子类(MergedBean后置处理器)applyMergedBeanDefinitionPostProcessors()
判断webApplicationType使用AnnotationConfigServletWebServerApplicationContext父类是GenericApplicationContext
尝试不以获取早期引用的方式从容器中获取当前name的bean,若有则说明出现循环依赖已经被子依赖bean提前初始化,判断是否能够直接使用早期引用
完成所有Bean的加载finishRefresh
判断bean是否实现了InitializingBean接口或者有自定义初始化方法是则执行初始化方法afterPropertiesSet()//属性注入后方法
把@Imports相关添加到deferredImportSelectorHandler
是
// FactoryMethod创建instantiateUsingFactoryMethod()
finally清空容器缓存resetCommonCaches
解析
// 需要延迟处理的ImportSelector springboot自动配置(主要就是AutoConfigurationImportSelector)
如果是延迟加载的话在parse()方法的最下方调用this.deferredImportSelectorHandler.process()执行自动装配(SpringBoot自动装配)如果延时处理的集合为空的话,直接再handle()中执行processGroupImports()进行加载
Y
对BeanFactory进行扩展实现customizeProxyFactory
process
// 返回对象的实例getObjectForBeanInstance()
buildAdvisors()获取advisor集合并加入proxyFactory中proxyFactory.addAdvisors(advisors);
注册bean后处理器registerBeanPostProcessors
刷新容器:refreshContext()
获取实例化策略并进行实例化getInstantiationStrategy().instantiate()
// 从父容器中获取对象parentBeanFactory.getBean()
createApplicationContext
如果在配置文件中配置了<context:component-scan></>会实例化AnnotationConfigUtils中的属性中对应的几个innerBean如果配置了AOP则会实例化AopConfigUtils中的几个innerBean
Factory后处理器方法
1初始化ApplicationListener监听器2初始化Initializer初始器3判断应用类型webApplicationType=SERVLET
不做处理
prepareBeanFactory()
没有获取到对象
进行代理,有两个实现一个CglibAopProxy一个JdkDynamicAopProxygetProxy()
经过一系列判断开始寻找使用的增强拦截器getAdvicesAndAdvisorsForBean
创建代理对象createProxy
new SpringApplication()
doProcessConfigurationClass
向三级缓存中存放生成font color=\"#ff0000\
生成CgLib子类
// 包含父类依赖信息的完整BeanDefinitionRootBeanDefinition
autowireByName
判断advisor是否可以用于当前beanfindAdvisorsThatCanApply
// 实际解析配置文件parseBeanDefinitions()
DefaultBeanDefinitionDocumentReader{// 判断是否是默认名称空间doRegisterBeanDefinitions()}
//调用容器的注册bean定义方法DefaultListableBeanFactory.registerBeanDefinition()//调用configClasses的注册器(例如FeignClientsRegistrar)loadBeanDefinitionsFromRegistrars()
AutowiredAnnotationBeanPostProcessor
AbstractRefreshableApplicationContextrefreshBeanFactory(){// 创建BeanFactory 类型为DefaultListableBeanFactorycreateBeanFactory();// 加载BeanDefinitonsloadBeanDefinitions();}
准备刷新:prepareRefresh()
自动配置导入选择器AutoConfigurationImportSelector.process(){ getAutoConfigurationEntry(){ //通过spring.factories文件EnableAutoConfiguration的值找到所有配置类 //过滤去重等 getCandidateConfigurations() }}
getBean()
main.run()
1收到事件创建一个cloud的 bootstrap容器(由BootstrapApplicationListener创建AnnotationConfigApplicationContext)2添加几个Initializer初始器:BootstrapApplicationListener.AncestorInitializer(会设置bootstrap容器为父容器)
invokeWithinTransaction
判断使用哪种代理方式getAopProxyFactory()
清空资源缓存clearResourceCaches初始化并注册上下文生命周期处理器initLifecycleProcessor();首先将刷新传播到生命周期处理器。getLifecycleProcessor().onRefresh();给所有监听器发布上下文最终刷新事件publishEvent(new ContextRefreshedEvent(this));向MBeanServer注册LiveBeansViewLiveBeansView.registerApplicationContext(this);
getImports
留给子类实现,Spring未使用,但以SpringBoot中有使用实现:1:注册Web应用程序作用域2:增加一个BeanPostProcessor(WebApplicationContextServletContextAwareProcessor())(可向bean注入ConfigurableWebApplicationContext应用上下文)
//@Autowire注解的构造方法autowireConstructor()
当前bean是否正在被代理
执行BeanFactory后处理器:invokeBeanFactoryPostProcessors
1、初始化属性源(servlet上下文占位符填充,子类实现)、校验必填属性2、this赋值:listeners-->earlyApplicationListeners(早期监听器)容器的listener添加时机:初始化器Initializer的初始化方法、run监听器等都有添加(EventPublishingRunListener在contextLoaded上下文加载完事件通知回调中,把SpringApplication扫描到的监听器都添加到ApplicationContext中)
容器刷新后afterRefresh()空方法
XmlBeanDefinitionReader{doLoadBeanDefinitions()}
创建代理工厂ProxyFactory proxyFactory = new ProxyFactory();
//执行Bean实例化感知后处理器的实例化后处理方法(提供修改bean状态的机会)postProcessAfterInstantiation()
特殊的interceptorTransactionInterceptor.invoke()
getMergedLocalBeanDefinition()
如果解析到Beans标签会递归到doRegisterBeanDefinitions()
进行非懒加载的Bean的实例化(new 对象)Bean的实例化有多种方式1、使用反射方式创建2、使用FactoryBean创建3、使用Supplier创建4、使用FactoryMethod创建5、使用InstantiationAwareBeanPostProcessor创建
AspectJAwareAdvisorAutoProxyCreator
获取当前bean设置的属性注入方式ByName、ByType
this.advised.getInterceptorsAndDynamicInterceptionAdvice()获取所有的可用的advice,构成一个list集合作为执行切面的责任链
// 判断是否是FactoryBean类型if (isFactoryBean(beanName))
spring中未做实现,SpringBoot中web容器启动的地方:createWebServer()方法:getWebServerFactory()获取ServletWebServerFactory类型的bean(springboot自动配置导入),通过这个工厂类获取一个webServer。同时会实例化相关的servlet (dispatcherServlet、filter等),并通过依赖注入会实例化跟servlet相关的那些单例bean,调用ServletContextInitializer相关初始化器的onStartup()方法
loadBeanDefinitions
获取RootBeanDefinition
发布正在运行事件:run监听器
autowireByType
因为SpringBoot的自动装配不能够覆盖我们自己的配置,所以应该将自动配置留到最后执行,在执行时发现已经有我们自己的配置,则自动配置就不生效
1:调用初始化器Initializer的初始化方法(包括AncestorInitializer:设置bootstrap容器为父容器)2:load加载main.class:注册为BeanDefinitionHolder:new AnnotatedGenericBeanDefinition(main.class)3:给spring容器添加一些监听器(通过初始化器、run监听器回调等)(contextLoaded事件)
doGetBean()
// 实际创建BeandoCreateBean()
缓存中获取到对象getSingleton()先1级再2级最后3级(发现循环依赖生成早期引用放2级删3级)
// 执行所有Bean后置处理器的初始化后方法applyBeanPostProcessorsAfterInitialization
对bean进行代理wrapIfNecessary
// 获取FactoryBean工厂对象,初始化工厂bean的单例实例Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
ConfigurationClassPostProcessor负责解析@Configuration、@Component、@Bean、@ComponentScan、@Import、@ImportResource注解如果是@Configuration注解标记为full、其余的注解标记为lite并对Spring自动装配的配置进行处理处理@Bean方法
对advisor进行排序sortAdvisors
若Bean实现了Aware的接口执行相应方法invokeAwareMethods
获得一个bean工厂obtainFreshBeanFactory()
解析依赖注入的注解
注册在所有的Listener
invokeBeanFactoryPostProcessors()
initMessageSource
registerBeanDefinitions()
initApplicationEventMulticaster
提供的用户扩展方法extendAdvisors
Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);获取拦截器链中的一个拦截器dm.interceptor.invoke(this);执行该拦截器的invoke()方法
// 通用BeanDefinitionGenericBeanDefinition
// 重点方法 springboot自动装配原理方法调用handler = new DeferredImportSelectorGroupingHandler()handler.register(选择器)handler.processGroupImports();
存在父容器
重要的处理器AbstractAutoProxyCreatorAOP生成代理对象(事务)
委托给它进行处理PostProcessorRegistrationDelegate{ invokeBeanFactoryPostProcessors(){ //1执行Registry后处理器 invokeBeanDefinitionRegistryPostProcessors //2执行Factory后处理器 invokeBeanFactoryPostProcessors }}
ConfigurationClassPostProcessor{ // 1执行注册表后处理器接口方法 postProcessBeanDefinitionRegistry(){ processConfigBeanDefinitions() } // 2执行BeanFactoryProcessor接口方法 postProcessBeanFactory()}
//创建单例对象mbd.isSingleton()
实例化bean
// 自定义标签解析parseCustomElement()
postProcessBeanFactory
processImports
使用AOP动态代理对其进行增强,目的是保证其中定义@Bean注解的单例问题
后续流程参看代码,画吐了
注册入BeanFactory的BeanDefinitionMaps和BeanDefinitionNames属性中
是否有MethodOverride对象!bd.hasMethodOverrides()
getRunListeners()初始化run监听器并开始发布事件准备环境environment文件
初始化事件多播器spring中观察者模式记录事件发生主要的组件:1、Event 事件2、Multicaster 多路广播器3、Listener 监听器
AbstractXmlApplicationContextloadBeanDefinition(){// 这里使用适配器模式 为beanFactory设置属性值 为给定的beanFactory创建一个bean定义信息读取器 XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);// 重载loadBeanDefinitionsloadBeanDefinitions(beanDefinitionReader);}
// 执行所有span style=\
AbstractApplicationContextrefresh()
启动完成
执行两类BeanFactoryPostProcessor(一类实现了注册表后处理接口、一类未实现):BeanDefinitionRegistryPostProcessor :Registry后处理器BeanFactoryPostProcessor :Factory后处理器执行流程:(先PriorityOrdered接口的,再Ordered接口的,最后普通的)1、先Registry后处理器方法(扫描所有BeanDefinition)2、再Factory后处理器方法span style=\
Scope
// 创建其他类型对象mbd.getScope()
web容器相关
出现异常destroyBeans(); 销毁beancancelRefresh(ex); 关闭容器
AbstractApplicationContextfinishBeanFactoryInitialization(){// 实例化单例对象DefaultListableBeanFactory.preInstantiateSingletons()}
容器Run的监听器实例化、准备环境environment
发布已启动事件:run监听器
初始化initializeBean()
收藏
0 条评论
回复 删除
下一页