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