Spring源码分析
2024-07-19 15:49:31 0 举报
SPRING源码分析
作者其他创作
大纲/内容
createBeanInstance
注册了internalPersistenceAnnotationProcessor的BeanDefinition
AbstractRefreshableApplicationContext中的refreshBeanFactory()刷新容器,加载资源
3. 为beanFactory增加一个默认的propertyEditor
AnnotatedBeanDefinitionReader
AnnotationConfigUtils.registerAnnotationConfigProcessors
bean标签
是
ConfigurationClassPostProcessor
获取bean的声明周期方法,PostConstruct和PreDestory
CommonAnnotationBeanPostProcessor
wrapIfNecessary
设置父容器为传递进来的parent
1. 设置容器的启动时间
loadBeanDefinitions()开始完成beanDefinition的加载
getBean(beanName)
3. 设置容器的激活标志位
执行实现了PriorityOrdered的BeanDefinitionRegistryPostProcessor
resolveBeforeInstantiation
注册默认的嵌入值解析器
调用入参beanFactoryPostProcessors中的普通BeanFactoryPostProcessor的postProcessBeanFactory方法
1. 设置容器启动时间2. 设置关闭状态为false3. 设置激活状态为true
注册CommonAnnotationBeanPostProcessor
执行各种Aware类型接口的注入
6.将监听器放入到earlyApplicationListeners中
DefaultBeanDefinitionDocumentReader
创建BeanDefinitionParserDelegate代理来解析document
2. 设置StandardBeanExpressionResolver为设置beanfactory的表达式语言处理器
1. 执行传入的BeanDefinitionRegistryPostProcessor类型的postProcessBeanDefinitionRegistry2. 获取容器中实现了BeanDefinitionRegistryPostProcessor和PriorityOrdered接口的postProcessBeanDefinitionRegistry3. 获取容器中实现了BeanDefinitionRegistryPostProcessor和Ordered接口的postProcessBeanDefinitionRegistry4. 执行剩下BeanDefinitionRegistryPostProcessor没有排序的postProcessBeanDefinitionRegistry5. 执行BeanDefinitionRegistryPostProcessor的postProcessBeanFactory6. 执行BeanFactoryPostProcessor和PriorityOrdered接口的postProcessBeanFactory7. 执行BeanFactoryPostProcessor和Ordered接口的postProcessBeanFactory8. 执行没有排序BeanFactoryPostProcessor的postProcessBeanFactory
对目标对象进行切面增强
注册所有实现了MergedBeanDefinitionPostProcessor类型的BeanPostProcessor到beanFactory中
1. 销毁bean对象2. 关闭bean容器
2.resolveBeforeInstantiation: 给BeanPostProcessors一个机会来返回代理来替代真正的实例
否
doCreateBean
遍历实现了PriorityOrdered接口的BeanFactoryPostProcessor,执行postProcessBeanFactory方法
AbstractAutoProxyCreator
getBeanFactory()返回上一步创建的容器对象
初始化applicationEventMulticaster为SimpleApplicationEventMulticaster
AbstractAutowireCapableBeanFactory
createBean:创建bean对象,填充属性,执行beanPostProcessor
InitDestroyAnnotationBeanPostProcessor
start
initApplicationEventMulticaster()
ApplicationListenerDetector
在构造函数中初始化AnnotatedBeanDefinitionReader
determineConstructorsFromBeanPostProcessors
创建一个xml的beanDefinitionReader,并通过回调设置到beanFactory中
使用cglib创建动态代理对象
添加了Component注解的过滤器
基于注解初始化spring容器流程
调用xmlBeanDefinitionReader中doLoadBeanDefinitions进行真正的处理
是否有Supplier
注册AutowiredAnnotationBeanPostProcessor
BeanDefinitionParserDelegate
parseBeanDefinitionElement 解析bean标签
在父类GenericApplicationContext构造函数中初始化了beanFactory
执行afterPropertiesSet和自定义的初始化方法
将传递进来的资源文件的locations设置到AbstractRefreshableConfigApplicationContext的configLocations中
AbstractApplicationContext
initApplicationEventMulticaster:初始化事件监听多路广播器
6. 添加LoadTimeWeaverAwareProcessor作为对AspectJ的支持
finishBeanFactoryInitialization(beanFactory)
doGetBean
调用所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnotationBeanTest.class)
注册了internalEventListenerFactory的BeanDefinition
applyBeanPostProcessorsAfterInitialization
如果Configuration包含注解@EnableAspectJAutoProxy,会注册AutoCreateAspectJ的BeanDefinition
obtainFreshBeanFactory()
5. 设置几个默认的自动装配规则,多个实现的情况,使用此处设置的
初始化loadTimeWeaverAware的bean
postProcessBeforeInstantiation
registerListeners()
是否实现了FactoryBean接口
obtainFreshBeanFactory()初始化容器并加载资源文件为BeanDefinition
基于xml创建spring容器,并加载资源为bean对象
通过allowCircularReferences设置是否允许bean之间存在循环依赖
instantiateBean
loadBeanDefinitions()加载资源文件为beanDefinition
ClassPathBeanDefinitionScanner
registerListeners: 注册监听器
执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry
AnnotationConfigApplicationContext
register(annotatedClasses)
初始化StandardEnvironment为environment
parseDefaultElement 解析默认标签(bean/import/alias/beans)
初始化PathMatchingResourcePatternResolver为resourceLoader
1. 解析@Configuration注解2. 解析@PropertySource注解3. 解析@ComponentScans注解4. 解析@Import注解5. 解析@ImportResource注解6. 解析@Bean注解
创建代理对象
执行ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry
applyBeanPostProcessorsBeforeInstantiation
getSingleton
autowireConstructor:通过构造函数进行注入
PostProcessorRegistrationDelegate
registerBeanPostProcessors: 注册所有的beanPostProcessor
5. populateBean:填充属性
AutowiredAnnotationBeanPostProcessor
是否存在bean容器
使用instantiateUsingFactoryMethod创建对象
注册了internalEventListenerProcessor的BeanDefinition
添加了Named注解的过滤器
为上下文初始化ConversionService类型转换器
注册了DelegatingMessageSource的beanDefinition
populateBean
invokeBeanFactoryPostProcessors:调用各种beanFactory处理器
7. 注册默认的系统环境bean到一级缓存中
invokeBeanFactoryPostProcessors
1. 设置类加载器2. 设置SPEL表达式解析器3. 设置属性编辑器4. 添加ApplicationContextAwareProcessor,用于各种Aware的设置5. 忽略通过Processor设置的aware的自动注入6. 设置几种接口默认的实现7. 设置环境变量
注册实现了Ordered接口的BeanPostProcessor实例添加到beanFactory中
注册了internalConfigurationAnnotationProcessor的BeanDefinition
xmlBeanDefinitionReader
在registerBeanDefinitions方法中创建BeanDefinitionDocumentReader对document进行解析
注册实现了PriorityOrdered接口的BeanPostProcessor实例添加到beanFactory中
注册了internalCommonAnnotationProcessor的BeanDefinition
ApplicationContext ac = new ClassPathXmlApplicationContext(\"applicationContext.xml\")
GenericApplicationContext
this.beanFactory = new DefaultListableBeanFactory();
实例化SimpleApplicationEventMulticaster
1. 注册实现了PriorityOrdered的BeanPostProcessor2. 注册实现了Ordered的BeanPostProcessor3. 注册没有实现排序接口的BeanPostProcessor4. 注册spring内置的BeanPostProcessor
注册没有实现PriorityOrdered和Ordered的BeanPostProcessor实例添加到beanFactory中
applyMergedBeanDefinitionPostProcessors
执行实现了Ordered的BeanDefinitionRegistryPostProcessor
创建容器,加载xml中的bean为BeanDefinition,并进行初始化和实例化
prepareBeanFactory: beanFactory的准备工作,对各种属性进行填充
遍历实现了Ordered接口的BeanFactoryPostProcessor,执行postProcessBeanFactory方法
ApplicationContextAwareProcessor
applyBeanPostProcessorsBeforeInitialization
初始化resourcePatternResolver为PathMatchingResourcePatternResolver
DefaultListableBeanFactory
preInstantiateSingletons: 实例化剩下的bean
初始化所有的单例bean
AbstractBeanFactory
getBean:通过beanName获取bean实例
使用反射基于默认构造函数创建bean对象
prepareRefresh()
4 initPropertySources()拓展方法,初始化属性资源
prepareBeanFactory(beanFactory)
是否是单例
finishBeanFactoryInitialization:初始化单例bean(非单例)
初始化DefaultListableBeanFactory为bean容器
7.创建刷新前的监听事件集合earlyApplicationEvents
invokeBeanFactoryPostProcessors: 执行所有的beanFactoryPostProcessor
1. 对标注@Configuration的bean进行增强,使用cglib创建Configuration的代理对象2. 增加了ImportAwareBeanPostProcessor
是否有FactoryMethod
为bean容器指定序列化id
2. 设置容器的关闭标志位
是否有methodOveriide
执行ConfigurationClassPostProcessor的postProcessBeanFactory
将解析出来的beanDefinition注册到beanDefinitionMap中
6. initializeBean实例化对象
注册监听器
onRefresh:空方法,留给子类来初始化其他的bean
public AbstractApplicationContext() { this.resourcePatternResolver = getResourcePatternResolver();}protected ResourcePatternResolver getResourcePatternResolver() { return new PathMatchingResourcePatternResolver(this);}
1. 获取beanFactory
调用父类AbstractApplicationContext的构造函数
4. applyMergedBeanDefinitionPostProcessors: 允许beanPostProcessor去修改合并的beanDefinition
调用xmlBeanDefinitionReader中的loadBeanDefinitions
通过instanceSupplier.get()返回创建的对象
1. 设置beanFactory的classloader为当前context的classloader
registerDisposableBeanIfNecessary
doGetBean:实际获取bean的方法
添加了ManagedBean注解的过滤器
注册启动类的beanDefinition到容器中
在doLoadDocument获取xml文件的document对象
beanFactory.preInstantiateSingletons()
注册RequiredAnnotationBeanPostProcessor
invokeBeanFactoryPostProcessors(beanFactory)
getSingleton:获取单例bean
创建StandardEnvironment
instantiateBean:实例化bean
在父类AbstractApplicationContext构造函数中初始化了Resolver
5.validateRequiredProperties()校验属性文件是否存在
遍历普通的BeanFactoryPostProcessor,执行postProcessBeanFactory方法
createBeanInstance: 根据执行bean使用对应的策略创建新的实例,如,工厂方法,构造函数主动注入、简单初始化
是否是默认标签
通过allowBeanDefinitionOverriding设置是否允许覆盖同名称对象
initMessageSource()
prepareRefresh()做容器刷新前的准备工作
initializeBean
注册了internalRequiredAnnotationProcessor的BeanDefinition
invokeInitMethods
执行PostConstruct方法
registerBeanPostProcessors(beanFactory)
parseCustomElement 解析自定义标签(componrent-scan)
处理ImportAware
调用AbstractApplicationContext中的refresh()加载资源到容器中
preInstantiateSingletons
注册了internalAutowiredAnnotationProcessor的BeanDefinition
3. doCreateBean: 实际创建bean的调用
customizeBeanFactory()定制beanFactory,设置相关属性
refresh()
registerBeanPostProcessors: 注册beanPostProcessors
注册AnnotationAwareAspectAutoProxyCreator
0 条评论
下一页