spring 源码分析笔记
2023-07-23 21:52:21 10 举报
AI智能生成
spring源码执行流程
作者其他创作
大纲/内容
ioc容器启动相关流程
new RootBeanDefinetion(ConfigurationClassPostProcessor.class)
new RootBeanDefinetion (AutowiredAnnotationBeanPostProcessor.class)
new RootBeanDefinetion(CommonAnnotationBeanPostProcessor.class)
new RootBeanDefinetion(PersistenceAnnotationBeanPostProcessor.class)
new RootBeanDefinetion(EventListenerMethodProcessor.class)
new RootBeanDefinetion(DefaultEventListenerFactory.class)
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);// 增加了一些beanPostProcessor的bean定义后面会用到
new AnnotatedBeanDefinitionReader(this)
this.includeFilters.add(new AnnotationTypeFilter(Component.class));
registerDefaultFilters
new ClassPathBeanDefinitionScanner(this);
this()
register(Config.class))
initPropertySources();
getEnvironment().validateRequiredProperties();
this.earlyApplicationEvents = new LinkedHashSet<>();
prepareRefresh();
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
根据配置判断是否增加表达式解析器:StandardBeanExpressionResolver
ApplicationContextAwareProcessor
ApplicationListenerDetector:用来识别我们自己写的事件监听器
addBeanPostProcessor
environment:jvm环境变量的bean
systemProperties:系统属性
applicationStartup
systemEnvironment:操作系统的换行变量
registerSingleton
prepareBeanFactory(beanFactory);
postProcessBeanFactory(beanFactory);
是否有@CommentScan注解,如果有直接解析成BeanDefinetion
是否有@Import注解,如果有先将这个类的和当前类放入集合,后面直接执行这个类的解析逻辑
是否有事先了ImportBeanDefinetionRegister的对象,如果有也是将该对象加入到集合,后面根据这个集合进行解析
postProcessBeanDefinitionRegistry
ConfigurationClassPathPostProcessor
BeanDefinetionRegisterPostProcessor
postProcessBeanFactory
BeanFactoryPostProcessor
BeanFactoryPostprocessor
invokeBeanFactoryPostProcessors(beanFactory);
CommonAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor
PostProcessorRegistrationDelegate
registerBeanPostProcessors(beanFactory);
initMessageSource();
initApplicationEventMulticaster();//初始化事件广播器
onRefresh();
registerListeners();
单例池有直接获取
有,先调用父类的doGetBean
没有再判断有没有依赖的Bean,有直接先创建依赖的Bean实例
单例bean,先从单例池获取,获取不到执行创建bean逻辑
原型bean,执行创建新的
比如session,会在创建bean完毕后将值set到session的Attribute里面
其它scope
最后根据bean的作用域执行相应创建bean逻辑
有没有父类的FactoryBean
单例池没有
font color=\"#e74f4c\
执行beanPostProcessor的逻辑,InstantiationAwareBeanPostProcessor
移除spring本身的一些FactoryBean
属性赋值
创建实例对象doCreateBean
实例化
如果有InstantiationAwareBeanPostProcessor
byType
byName
判断是否有系统推断的ByName和ByType的方式赋值,如果有则执行对应方式进行赋值
先去寻找属性注入点(也就是先去寻找哪个属性上加了@Autowired注解)添加到注入点集合当中去
再去寻找方法的注入点(方法上面添加了@Autyowired、@value、@Inject)的注解
AutowiredFieldElement.inject
AutowiredMethodElement.injject
循环遍历前面2个步骤的所有注入点赋值
调用postProcessProperties()
处理@Resource、@Value注解
ImportAwareBeanPostProcessor
调用后置处理器处理各种各种标签InstantiationAwareBeanPostProcessor.postProcessProperties()
执行一系列的aware回调方法invokeAwareMethods
invokeInitMethods
InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization
初始化前BeanPostProcessor.postProcessBeforeInitialization
InitializingBean.afterPropertiesSet
初始化方法invokeInitMethods
根据bean先获取所有匹配advisor
获取到所有的advisor调用链,然后通过反射在执行invoke的方法的时候织入代理逻辑
JdkDynamicAopProxy
构建Enhancer执行器生成代理对象
CglibAopProxy
创建动态代理ProxyFactory.createProxy
wrapIfNecessary
AbstractAutoProxyCreator.postProcessAfterInitialization
Aop动态代理
初始化后BeanPostProcessor.postProcessAfterInitialization
增加和注册销毁的registerDisposableBeanIfNecessary
使用bean
销毁bean
createBean创建bean的具体逻辑,也即是bean的生命周期
doCreatBean
预先加载单例bean:preInstantiateSingletons()
finishBeanFactoryInitialization(beanFactory)
finishRefresh();
refresh()
AnnotationConfigApplicationContext(Config.class)
0 条评论
回复 删除
下一页