Spring源码阅读笔记
2023-12-26 09:23:51 43 举报
Spring源码阅读笔记:深入理解IOC和AOP的原理,掌握Bean的生命周期,学习如何使用Spring的注解驱动开发。通过阅读源码,了解Spring如何实现事务管理、缓存管理和Web开发支持等高级功能。此外,还探讨了Spring Boot的自动配置原理和如何自定义Starter。总之,通过阅读Spring源码,不仅提高了自己的编程能力,也为成为一名优秀的Java工程师打下了坚实的基础。
作者其他创作
大纲/内容
1、设置容器的启动时间和状态2、初始化容器的监听器集合3、初始化监听器事件集合
initApplicationEventMulticaster
重要实现类AutowiredAnnotationBeanPostProcessor解析@Autowired、@Value注解CommonAnnotationBeanPostProcessor解析@PostConstruct、@PreDestroy、@Resource注解
// 获取FactoryBean工厂对象Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
没有获取到对象
XmlBeanDefinitionReader{doLoadBeanDefinitions()}
如果解析到Beans标签会递归到doRegisterBeanDefinitions()
// 通用BeanDefinitionGenericBeanDefinition
设置Aware接口invokeAwareMethods
Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);获取拦截器链中的一个拦截器dm.interceptor.invoke(this);执行该拦截器的invoke()方法
DynamicAdvisedInterceptor.intercept()执行代理方法会进入CglibAOpProxy的静态内部类DynamicAdvisedInterceptor中执行intercept()方法
finishBeanFactoryInitialization
创建单例对象mbd.isSingleton()
parseDefaultElement()
存在父容器
// 对Configuration配置类进行增强enhanceConfigurationClasses()
spring中未做实现,SpringBoot中Tomcat容器启动的地方
// springboot自动装配方法processConfigBeanDefinitions(){//判断beanDefinition是否是配置类并进行标记ConfigurationClassUtils.checkConfigurationClassCandidate();// 获取Configuration解析器对配置类进行解析ConfigurationClassParser parser = new ConfigurationClassParser();// 解析配置类,springboot自动配置也在这里解析parser.parse(candidates);}
缓存中获取到对象
执行后置beanPostProcessorapplyBeanPostProcessorsAfterInitialization
完成Bean的加载finishRefresh
getBean()
// 判断Bean是否是实例的 是单例的 是非懒加载的if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit())
负责解析<import><alias><bean><beans>标签
获取advisor集合并加入proxyFactory中buildAdvisors()proxyFactory.addAdvisors(advisors);
忽略
无
AbstractBeanFactory{doGetBean()}
执行InstantiationAwareBeanPostProcessors
getMergedLocalBeanDefinition()
清空资源缓存clearResourceCaches初始化上下文生命周期的processorinitLifecycleProcessor();
执行两类BeanFactoryPostProcessor:1、BeanDefinitionRegistryPostProcessor2、BeanFactoryPostProcessor执行流程:1、先执行BeanDefinitionRegistryPostProcessor 1)执行参数beanFactoryPostProcessors中的BeanDefinitionRegistryPostProcessor 2)执行从容器中获取的BeanDefinitionRegistryPostProcessor 1)执行PriorityOrdered类型的BeanDefinitionRegistryPostProcessor 2)执行Ordered类型的BeanDefinitionRegistryPostProcessor 3)执行未实现排序接口的BeanDefinitionRegistryPostProcessor2、执行BeanFactoryPostProcessor(执行顺序与BeanDefinitionRegistryPostProcessor类似)
instantiateUsingFactoryMethod()
N
后续流程参看代码,画吐了
// 包含父类依赖信息的完整BeanDefinitionRootBeanDefinition
执行InstantiationAwareBeanPostProcessorInstantiationAwareBeanPostProcessor
this.advised.getInterceptorsAndDynamicInterceptionAdvice()获取所有的可用的advice,构成一个list集合作为执行切面的责任链
AbstractApplicationContextrefresh()
不做处理
未使用InstantiationAwareBeanPostProcessor创建对象
进行非懒加载的Bean的实例化Bean的实例化有多种方式1、使用反射方式创建2、使用FactoryBean创建3、使用Supplier创建4、使用FactoryMethod创建5、使用InstantiationAwareBeanPostProcessor创建
注册在所有的Listener
获取到标签的命名空间->找到自定义标签解析器->进行解析BeanDefinitionParserDelegate{// 解析标签MethodparseCustomElement();}
有
生成CgLib子类
ConfigurationClassPostProcessor负责解析@Configuration、@Component、@Bean、@ComponentScan、@Import、@ImportResource注解如果是@Configuration注解标记为full、其余的注解标记为lite并对Spring自动装配的配置进行处理
是
AbstractRefreshableApplicationContextrefreshBeanFactory(){// 创建BeanFactory 类型为DefaultListableBeanFactorycreateBeanFactory();// 加载BeanDefinitonsloadBeanDefinitions();}
多次重载
Y
postProcessBeanFactory
// 重点方法 springboot自动装配原理方法调用 handler.processGroupImports();
当前bean是否正在被代理
对BeanFactory进行扩展实现customizeProxyFactory
对bean进行初始化initializeBean()
初始化事件多播器spring中观察者模式记录事件发生主要的组件:1、Event 事件2、Multicaster 多路广播器3、Listener 监听器
// getImports() 重点方法 在springboot中会调用AutoConfigurationImportSelector实现类的的process方法grouping.getImports().forEach(entry -> {ConfigurationClass configurationClass = this.configurationClasses.get( entry.getMetadata());
进行国际化设置
DefaultBeanDefinitionDocumentReader{// 判断是否是默认名称空间doRegisterBeanDefinitions()}
留给子类实现,Spring未使用,但以SpringBoot中有使用实现
通过反射进行实例化BeanUtils.instantiateClass(constructorToUse)
获取当前bean的注入方式ByName、ByType
ConfigurationClassParser{// 对配置注解标记的BeanDefinition进行处理parser();}
autowireByType
AbstractAutoProxyCreator{// 后置bean处理器postProcessAfterInitialization()}
不存在父容器
获取实例化策略并进行实例化getInstantiationStrategy().instantiate()
AbstractApplicationContext{// 执行beanFactoryPostProcessorinvokeBeanFactoryPostProcessors()}
获取RootBeanDefinition
提供的用户扩展方法extendAdvisors
默认构造方法注入instantiateBean()
否
与AOP相同的前置处理
如果是延迟加载的话在parse()方法的最下方调用this.deferredImportSelectorHandler.process()执行自动装配(SpringBoot自动装配)如果延时处理的集合为空的话,直接再handle()中执行processGroupImports()进行加载
特殊的interceptorTransactionInterceptor.invoke()
声明式事务处理
开始创建对象
onRefresh
自定义构造方法注入autowireConstructor()
// 从父容器中获取对象parentBeanFactory.getBean()
对父容器进行检查
// 创建其他类型对象mbd.getScope()
AbstractXmlApplicationContextloadBeanDefinition(){// 这里使用适配器模式 为beanFactory设置属性值 为给定的beanFactory创建一个bean定义信息读取器 XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);// 重载loadBeanDefinitionsloadBeanDefinitions(beanDefinitionReader);}
执行AOP代理方法
对默认名称空间下的标签和其他名称空间下的标签进行分类解析parseDefaultElement() // 解析默认命名空间下的标签parseCustomElement() // 解析其他标签(自定义标签)自定义标签解析流程1、先读取META-INF/spring.handlers文件 对约束文件进行映射找到自定义名称空 间的解析类 解析类中有init()方法内部包含该名称空间下各个标签的解析类 2、读取META-INF/spring.schemas文件 找到名称空间下对应标签的xsd约束文件 3、读取xsd约束文件 4、自定义标签解析类
注册入BeanFactory的BeanDefinitionMaps和BeanDefinitionNames属性中
出现异常destroyBeans(); 销毁beancancelRefresh(ex); 关闭容器
将BeanFactory中解析到的BeanPostProcessor进行注册具体流程与invokeBeanFactoryPostProcessor类似但并不进行执行,只是将所有找到的PostProcessor放入AbstractBeanFactory.beanPostProcessors集合中
// 执行前置BeanPostProcessorapplyBeanPostProcessorsBeforeInitialization
创建代理中介类,如果目标类有接口使用JDK代理,否则使用CGLib代理createAopProxy
// 通过InstantiationAwareBeanPostProcessor创建BeanresolveBeforeInstantiation()
执行MergedBeanDefinitionPostProcessorapplyMergedBeanDefinitionPostProcessors
直接抛出异常throw new BeanCreationException
创建代理对象proxyFactory.getProxy()
重要PostProcessor
可以修改Bean的状态信息是否有InstantiationAwareBeanPostProcessors
重要的BeanFactoryPostProcessor
AutowiredAnnotationBeanPostProcessor
Aop生成代理对象就位于该步骤中使用AbstractAutoProxyCreator进行代理对象的创建
createBean()
判断advisor是否可以用于当前beanfindAdvisorsThatCanApply
registerListeners
obtainFromSupplier()
因为SpringBoot的自动装配不能够覆盖我们自己的配置,所以应该将自动配置留到最后执行,在执行时发现已经有我们自己的配置,则自动配置就不生效
// 判断是否需要立即初始化if (isEagerInit)
autowireByName
对bean进行代理wrapIfNecessary
// FactoryMethod创建mbd.getFactoryMethodName() != null
// 判断是否是FactoryBean类型if (isFactoryBean(beanName))
invokeBeanFactoryPostProcessors
对BeanFactory的属性进行设置设置BeanFactory的类加载器设置EL表达式解析器设置属性类型转换器忽略一些Aware接口并增加一个BeanPostProcessor(ApplicationListenerDetector()) // 用于监听器探测
根据AdvisorName创建advisor对象
initMessageSource
AbstractAutoProxyCreator
// 处理延迟处理的ImportSelector springboot自动配置方法在里面调用 this.deferredImportSelectorHandler.handle();
不为true
prepareBeanFactory()
为true的话直接return!ibp.postProcessAfterInstantiation()
// 自定义标签解析parseCustomElement()
// 实例化Bean对象createBeanInstance()
根据type从当前容器和父容器中寻找所有的AdvisorName并放入cachedAdvisorBeanNames缓存中
AbstractApplicationContextfinishBeanFactoryInitialization(){// 实例化单例对象DefaultListableBeanFactory.preInstantiateSingletons()}
如果在配置文件中配置了<context:component-scan></>会实例化AnnotationConfigUtils中的属性中对应的几个innerBean如果配置了AOP则会实例化AopConfigUtils中的几个innerBean
finally清空容器缓存resetCommonCaches
PostProcessorRegistrationDelegate{// 实际执行BeanFactoryPostProcessorinvokeBeanFactoryPostProcessors()}
使用AOP动态代理对其进行增强,目的是保证其中定义@Bean注解的单例问题
判断使用哪种代理方式getAopProxyFactory()
进行属性填充populateBean()
// 实际创建BeandoCreateBean()
// 实际解析配置文件parseBeanDefinitions()
对advisor进行排序sortAdvisors
// 创建原型对象mbd.isPrototype()
prepareRefresh()
进行代理,有两个实现一个CglibAopProxy一个JdkDynamicAopProxygetProxy()
ConfigurationClassPostProcessor{// 执行BeanDefinitionRegistryPostProcessorpostProcessBeanDefinitionRegistry()// 执行BeanFactoryProcessorpostProcessBeanFactory()}
寻找合适的增强对象findEligibleAdvisors
registerBeanPostProcessors
为什么不会直接进入我们的业务类?因为在创建类时生成的就是代理类,我们通过getBean()获取到的bean是经过代理后的bean
// 使用supplier创建mbd.getInstanceSupplier()
详细流程
寻找候选的advisorfindCandidateAdvisors
创建代理工厂ProxyFactory proxyFactory = new ProxyFactory();
经过一系列判断开始寻找使用的增强拦截器getAdvicesAndAdvisorsForBean
执行初始化方法invokeInitMethods
invokeWithinTransaction
AspectJAwareAdvisorAutoProxyCreator
获取到的bean为null 但有<property>注入属性bw == nullmbd.hasPropertyValues()
obtainFreshBeanFactory()
创建代理对象createProxy
// 提前检查单例缓存中是否有手动注册的单例对象getSingleton(beanName);
是否有MethodOverride对象!bd.hasMethodOverrides()
// 返回对象的实例getObjectForBeanInstance()
registerBeanDefinitions()
0 条评论
下一页