Spring 源码解析
2021-12-13 13:59:35 183 举报
AI智能生成
登录查看完整内容
Spring 源码
作者其他创作
大纲/内容
Spring基础知识
springioc加载流程图
SpringIOC 加载流程图,详见链接
this.beanFactory = new DefaultListableBeanFactory();
调用用父类构造函数,初始化BeanFactory
设置IOC容器ApplicationContext对象
设置Bean工厂对象
设置环境对象
设置资源加载对象
设置类加载器对象
用户处理条件表达式计算 @Condition
internalConfigurationAnnotationProcessorConfigurationAnnotationProcessor
子主题
internalAutowiredAnnotationProcessorAutowiredAnnotationBeanPostProcessor
internalCommonAnnotationProcessorCommonAnnotationBeanPostProcessor
internalEventListenerFactory DefaultEventListenerFactory
internalEventListenerProcessorEventListenerMethodProcessor
internalRequiredAnnotationProcessorRequiredAnnotationBeanPostProcessor
AnnotationAwareOrderComparator
ContextAnnotationAutowireCandidateResolver
注册一些配置的后置处理器
负责处理@EventListener
负责解析配置类
用于解析@Autowired
负责解析@Resource、@WebServiceRef、@EJB三个注解
负责解析@Required,过时
不重要,第一个是解析@Order
this.reader = new AnnotatedBeanDefinitionReader(this);
初始化Bean定义扫描器并注册内置PostProcessor
this.scanner = new ClassPathBeanDefinitionScanner(this);
初始化 classPath类型的 bean定义扫描器
this()
通过AnnotatedGenericBeanDefinition的构造方法,获得配置类的BeanDefinition
判断需不需要跳过注册,Spring中有一个@Condition注解,如果不满足条件,就会跳过这个类的注册
解析作用域,如果没有设置的话,默认为单例
获得BeanName
解析通用注解并填充到 AnnotatedGenericBeanDefinition-Lazy,Primary,DependsOn,Role,Description
限定符处理,不是特指@Qualifier注解,也有可能是Primary,或者是Lazy,或者是其他
把AnnotatedGenericBeanDefinition数据结构和beanName封装到一个对象中(方便传参)
注册,最终会调用 DefaultListableBeanFactory 中的 registerBeanDefinition() 方法
大致逻辑如
register(componentClasses)
准备刷新上下文环境prepareBeanFactory(beanFactory)
对Bean工厂进行填充属性prepareBeanFactory(beanFactory)
流程图
调用Bean工厂的后置处理器(内置+自定义)该方法去还会实例化几个内置beaninvokeBeanFactoryPostProcessors(beanFactory)
ApplicationContextAwareProcessor
ApplicationListenerDetector
invokeBeanFactoryPostProcessors
AutowireAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
beanFactory.addBeanPostProcessor(postProcessor)
注册Bean的后置处理器registerBeanPostProcessors(beanFactory)
初始化国际资源initMessageSource()
创建事件多播器initApplicationEventMulticaster()
空方法,留给子类实现onRefresh()
将事件监听器注册到多播器上registerListeners()
蓝色部分监听器SpringListeners
熟悉监听器的使用
判断容器中有无,有直接拿,没有new()new SimpleApplicationEventMulticaster(beanFactory)
循环获取容器中的早期对象,注册都多播器中getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName)
Bean初始化后的BeanPostrocessor中调用ApplicationListenerDetector再次将监听器注册到事件多播器中(之前懒加载的Bean没有注册)
ApplicationListener接口监听器解析
请回到上图this()方法查看两个监听器相关的后置处理器
解析@EventListener或基础ApplicationEvent的
接口直接调用
注解反射调用
listener.onApplicationEvent(event)
支持异步播发线程中提交事件进行播发,否则直接执行
发布事件publishEvent()
监听器
实例化createBeanInstance()
实现赋值populateBean()
初始化initializeBean()
加入单例池addSingletonFactory()
getBean() =>doGetBean() =>createBean() =>doCreateBean()
Bean后置处理器的九处调用
使用
销毁:容器销毁时
链接
三级缓存
循环依赖解决
+ 后面三个就是 Spring Bean 完整生命周期具体流程在链接中详细介绍,备注也会介绍
冻结所有BeanDefinition,初始化非懒加载单例BeanbeanFactory.freezeConfiguration()beanFactory.preInstantiateSingletons();
实例化懒加载单例Bean的Bean的创建过程(生命周期)finishBeanFactoryInitialization(beanFactory)
容器刷新 finishRefresh()
清除元数据缓冲 resetCommonCaches()
refresh() 刷新容器其实里面就13个方法在后面进行分类解析
调用BeanFactoryPostProcessBean定义注册BeanDefinitionMap中实例化部分内置Bean
SpringIOC
注册配置类的BeanDefinitionApplicationContext中传入的
注册的是内置的BeanDefinition会将他们加入BeanDefinitionMap
AspectJAutoProxyRegistrar.class=> registerBeanDefinitions()
AopConfigUtilsregisterAspectJAnnotationAutoProxyCreatorIfNecessary()
AopConfigUtils 注册BeanDefinitionregisterOrEscalateApcAsRequired(font color=\"#f57c00\
结构关系图
postProcessBeforeInstantiation()
getEarlyBeanReference()
SmartInstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor
postProcessAfterInstantiation()
BeanPostProcessor
AbstractAutoProxyCreator.classSpirngAOP 最核心的类
注册了一个 BeanDefinitionAnnotationAwareAspectJAutoProxyCreator继承了AbstractAutoProxyCreator.class
@EnableAspectJAutoProxy 开启AOP
org.springframework.aop.config.internalAutoProxyCreatorAnnotationAwareAspectJAutoProxyCreator
注册Bean的后置处理器AbstractBeanFactoryaddBeanPostProcessor()
注册Bean的后置处理器PostProcessorRegistrationDelegateregisterBeanPostProcessors()
注册Bean的后置处理器AnnotationConfigApplicationContextregisterBeanPostProcessors()
刷新IOC容器AnnotationConfigApplicationContextrefresh()
注册BeanPostProcessor处理AOP
空壳方法,无实现,仅调用doCreatBeanAbstractBeanFactorygetBean()
初始化所有的非懒加载单例BeanDefaultListableBeanFactorypreInstantiateSingletons()
实例化懒加载单例Bean的AnnotationConfigApplicationContextfinishBeanFactoryInitialization()
Spring解析切面流程图详见链接
进行后置处理解析切面AbstractAutowireCapableBeanFactorypostProcessBeforeInstantiation()
找缓存中是否有,有说明被解析过,直接返回
循环所有的beanName判断名字是否符合
是否正在创建
组装advisors返回并加入缓存
接口方式切面解析AbstractAdvisorAutoProxyCreator即:super.findCandidateAdvisors()
不符合条件直接忽略
接口方式切面解析AbstractAdvisorAutoProxyCreatorfindEligibleAdvisors()
事务切面解析
让BeanPostProcessors有机会返回一个代理而不是目标bean实例AbstractAutowireCapableBeanFactoryresolveBeforeInstantiation()
创建BeanAbstractAutowireCapableBeanFactorycreatBean()
创建BeanAbstractBeanFactorydoCreatBean()
解析切面将Advice加入缓存
创建代理流程详见链接图解
Bean后置处理器AbstractAdvisingBeanPostProcessorpostProcessAfterInitialization()
调用的bean的后置处理器的postProcessorsBeforeInitialization方法AbstractAutowireCapableBeanFactoryapplyBeanPostProcessorsBeforeInitialization()
进行对象初始化操作(在这里可能生成代理对象)AbstractAutowireCapableBeanFactoryinitializeBean()
创建代理CGLIB 或 JDK
调用动态代理JdkDynamicAopProxy => getProxy()font color=\"#f44336\
调用动态代理ProxyFactorygetProxy()
调用代理JDK代理为例
SpringAOP
AbstractAdvisorAutoProxyCreator
internalAutoProxyCreatorinfrastructureAdvisiorAutoProxyCreator
AutoProxyRegistrar
internalTransactionAdvisorBeanFactoryTransactionAttributeSourceAdvisor
TransactionAttributeSource
TransactionInterceptor
ProxyTransactionManagementConfiguration
TransactionManagementConfigurationSelectorString[] selectImports(AdviceMode adviceMode)
AOP注册Bean后置处理器那条线
注册BeanPostProcessor详见IOC
AOP事务解析切面那条线
解析切面
解析过直接返回true
返回true
加入缓存
加入事务的描述属性中
解析注解
判断是否有@Transactional注解getTransactionAttributeSource()
根据事务切点匹配命中的方法TransactionAttributeSourcePointcutmatches()
事务创建代理
AOP创建代理那条线
创建代理
AOP调用代理
调用代理
事务的传播机制
Spring 事务
SpringMVC流程图
一张流程图全了解
Spring容器与pringMVC容器的关系
SpringMVC
Spring 源码
0 条评论
回复 删除
下一页