Spring 源码解析
2021-12-13 13:59:35 195 举报
AI智能生成
Spring 源码
作者其他创作
大纲/内容
<b>SpringIOC</b>
<b>Spring基础知识</b>
<b>SpringIOC 加载流程图,详见链接</b>
<b>this()</b>
<b>调用用父类构造函数,初始化BeanFactory </b>
this.beanFactory = new DefaultListableBeanFactory();
<b>初始化Bean定义扫描器并注册内置PostProcessor</b>
<b>this.reader = new AnnotatedBeanDefinitionReader(this); </b>
用户处理条件表达式计算 @Condition
设置IOC容器ApplicationContext对象
设置Bean工厂对象
设置环境对象
设置资源加载对象
设置类加载器对象
注册一些配置的后置处理器<br>
<span style="font-size: inherit;">internalConfigurationAnnotationProcessor<br>ConfigurationAnnotationProcessor</span><br>
internalAutowiredAnnotationProcessor<br>AutowiredAnnotationBeanPostProcessor<br>
子主题
internalCommonAnnotationProcessor<br>CommonAnnotationBeanPostProcessor<br>
internalEventListenerFactory<br> DefaultEventListenerFactory<br>
internalEventListenerProcessor<br>EventListenerMethodProcessor<br>
internalRequiredAnnotationProcessor<br>RequiredAnnotationBeanPostProcessor<br>
<font color="#9e9e9e">AnnotationAwareOrderComparator</font>
<font color="#9e9e9e">ContextAnnotationAutowireCandidateResolver</font>
<b>初始化 classPath类型的 bean定义扫描器</b>
this.scanner = new ClassPathBeanDefinitionScanner(this);
<b>register(componentClasses)</b>
大致逻辑如
通过AnnotatedGenericBeanDefinition的构造方法,获得配置类的BeanDefinition
判断需不需要跳过注册,Spring中有一个@Condition注解,如果不满足条件,就会跳过这个类的注册
解析作用域,如果没有设置的话,默认为单例
获得BeanName
解析通用注解并填充到 AnnotatedGenericBeanDefinition-Lazy,Primary,DependsOn,Role,Description
限定符处理,不是特指@Qualifier注解,也有可能是Primary,或者是Lazy,或者是其他
把AnnotatedGenericBeanDefinition数据结构和beanName封装到一个对象中(方便传参)
注册,最终会调用 DefaultListableBeanFactory 中的 registerBeanDefinition() 方法
<b>refresh() 刷新容器<br></b>其实里面就13个方法<br>在后面进行分类解析<br>
<b>准备刷新上下文环境</b><br>prepareBeanFactory(beanFactory)<br>
<b>告诉子类初始化Bean工厂(MVC),获取Bean工厂</b><br>ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()<br>
<b>对Bean工厂进行填充属性<br></b>prepareBeanFactory(beanFactory)<br>
<b>空方法,留给子类实现<br></b>postProcessBeanFactory(beanFactory)<br>
<b>调用Bean工厂的后置处理器(内置+自定义)</b><br>该方法去还会实例化几个内置bean<br><b><font color="#f44336">invokeBeanFactoryPostProcessors(beanFactory)</font></b><br>
<b>流程图</b>
<b>注册Bean的后置处理器</b><br>registerBeanPostProcessors(beanFactory)<br>
beanFactory.addBeanPostProcessor(postProcessor)
<b>ApplicationContextAwareProcessor</b>
ApplicationListenerDetector
invokeBeanFactoryPostProcessors
AutowireAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
初始化国际资源<br>initMessageSource()<br>
<b>蓝色部分</b><br><b><font color="#f44336">监听器SpringListeners</font></b><br>
<b>创建事件多播器</b><br>initApplicationEventMulticaster()<br>
<b>空方法,留给子类实现</b><br>onRefresh()<br>
<b>将事件监听器注册到多播器上</b><br>registerListeners()<br>
<b><font color="#ff9800">实例化懒加载单例Bean的<br></font><font color="#f44336">Bean的创建过程(生命周期)</font></b><br>finishBeanFactoryInitialization(beanFactory)<br>
<b>冻结所有BeanDefinition,初始化非懒加载单例Bean</b><br>beanFactory.freezeConfiguration()<br>beanFactory.preInstantiateSingletons();<br>
getBean() =><br>doGetBean() =><br>createBean() =><br><b><font color="#f44336">doCreateBean()</font></b><br>
<b>实例化</b><br>createBeanInstance()<br>
<b>实现赋值</b><br>populateBean()<br>
<b>初始化<br></b>initializeBean()<br>
<b>加入单例池</b><br>addSingletonFactory()<br>
容器刷新 <br>finishRefresh()<br>
清除元数据缓冲<br> resetCommonCaches()
<b>SpringAOP</b>
@EnableAspectJAutoProxy <br>开启AOP
AspectJAutoProxyRegistrar.class<br>=><font color="#f57c00"> registerBeanDefinitions()</font><br>
AopConfigUtils<br>registerAspectJAnnotationAutoProxyCreatorIfNecessary()<br>
AopConfigUtils 注册BeanDefinition<br>registerOrEscalateApcAsRequired(<font color="#f57c00">AnnotationAwareAspectJAutoProxyCreator.class</font>, registry, source)<br>
<font color="#f57c00">注册了一个 BeanDefinition</font><br>AnnotationAwareAspectJAutoProxyCreator<br>继承了AbstractAutoProxyCreator.class<br>
结构关系图
AbstractAutoProxyCreator.class<br><b><i><font color="#f44336">SpirngAOP 最核心的类</font></i></b>
SmartInstantiationAwareBeanPostProcessor
postProcessBeforeInstantiation()
getEarlyBeanReference()
InstantiationAwareBeanPostProcessor
BeanPostProcessor
postProcessAfterInstantiation()
注册BeanPostProcessor<br>处理AOP
刷新IOC容器<br>AnnotationConfigApplicationContext<br>refresh()<br>
注册Bean的后置处理器<br>AnnotationConfigApplicationContext<br>registerBeanPostProcessors()<br>
注册Bean的后置处理器<br>PostProcessorRegistrationDelegate<br>registerBeanPostProcessors()<br>
注册Bean的后置处理器<br>AbstractBeanFactory<br>addBeanPostProcessor()<br>
org.springframework.aop.config.internalAutoProxyCreator<br>AnnotationAwareAspectJAutoProxyCreator<br>
解析切面<br>将Advice加入缓存
实例化懒加载单例Bean的<br>AnnotationConfigApplicationContext<br>finishBeanFactoryInitialization()<br>
初始化所有的非懒加载单例Bean<br>DefaultListableBeanFactory<br>preInstantiateSingletons()<br>
空壳方法,无实现,仅调用doCreatBean<br>AbstractBeanFactory<br>getBean()<br>
创建Bean<br>AbstractBeanFactory<br>doCreatBean()<br>
创建Bean<br>AbstractAutowireCapableBeanFactory<br>creatBean()<br>
让BeanPostProcessors有机会返回一个代理而不是目标bean实例<br>AbstractAutowireCapableBeanFactory<br>resolveBeforeInstantiation()<br>
进行后置处理解析切面<br>AbstractAutowireCapableBeanFactory<br>postProcessBeforeInstantiation()<br>
Spring解析切面流程图详见链接
事务切面解析
接口方式切面解析<br>AbstractAdvisorAutoProxyCreator<br>findEligibleAdvisors()<br>
接口方式切面解析<br>AbstractAdvisorAutoProxyCreator<b><font color="#f44336"><br>即:super.findCandidateAdvisors()</font></b><br>
找缓存中是否有,有说明被解析过,直接返回
循环所有的beanName判断名字是否符合
是否正在创建
调用:this.beanFactory.getBean(name, Advisor.class)<br>创建出 BeanFactoryTransactionAttributeSourceAdvisor
组装advisors返回并加入缓存
创建代理<br>CGLIB 或 JDK
创建Bean<br>AbstractBeanFactory<br>doCreatBean()
进行对象初始化操作(在这里可能生成代理对象)<br>AbstractAutowireCapableBeanFactory<br>initializeBean()<br>
调用的bean的后置处理器的postProcessorsBeforeInitialization方法<br>AbstractAutowireCapableBeanFactory<br>applyBeanPostProcessorsBeforeInitialization()<br>
Bean后置处理器<br>AbstractAdvisingBeanPostProcessor<br>postProcessAfterInitialization()<br>
创建代理流程详见链接图解
调用代理<br>JDK代理为例
调用动态代理<br>ProxyFactory<br>getProxy()<br>
调用动态代理<br>JdkDynamicAopProxy => getProxy()<br><font color="#f44336"><b>return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);</b></font><br>
<b>Spring 事务</b>
开启事务,导入组件<br>@EnableTransactionManagement<br>
TransactionManagementConfigurationSelector<br><b>String[] selectImports(AdviceMode adviceMode)</b><br>
AutoProxyRegistrar
internalAutoProxyCreator<br>infrastructureAdvisiorAutoProxyCreator
AbstractAdvisorAutoProxyCreator<b><font color="#f44336"><br></font></b>
ProxyTransactionManagementConfiguration
internalTransactionAdvisor<br>BeanFactoryTransactionAttributeSourceAdvisor<br>
TransactionAttributeSource
TransactionInterceptor
注册BeanPostProcessor<br>详见IOC
AOP注册Bean后置处理器那条线
<b>注册Bean的后置处理器</b><br>registerBeanPostProcessors(beanFactory)
beanFactory.addBeanPostProcessor(postProcessor)
internalAutoProxyCreator<br>infrastructureAdvisiorAutoProxyCreator
解析切面
AOP事务解析切面那条线
创建代理
AOP创建代理那条线
Bean后置处理器<br>AbstractAdvisingBeanPostProcessor<br>postProcessAfterInitialization()<br>
事务创建代理
根据事务切点匹配命中的方法<br>TransactionAttributeSourcePointcut<br>matches()<br>
判断是否有@Transactional注解<br>getTransactionAttributeSource()<br>
解析过直接返回true
解析注解
加入事务的描述属性中
加入缓存
返回true
调用代理
AOP调用代理
事务的传播机制
SpringMVC
一张流程图全了解
Spring容器与pringMVC容器的关系
0 条评论
下一页