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