# spring-framework-5.2.6.RELEASE **Repository Path**: mrhc1994/spring-framework-5.2.6.-release ## Basic Information - **Project Name**: spring-framework-5.2.6.RELEASE - **Description**: 学习源码用的 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-02-07 - **Last Updated**: 2025-03-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: Spring, spring源码学习 ## README 1:gradle目录中的gradle-wrapper.properties中配置好distributionUrl属性,指定本地的gradle安装包(保持和源码中依赖的版本一致),避免联网下载 2:配置gradle。我用的是idea,配置入图下 ![gradle配置](gradle/config.png) ![初级容器(XmlBeanFactory)实例化过程](pic/初级容器实例化过程.png) bean实例化初始化过程 ![初级容器(XmlBeanFactory)bean实例化初始化过程](pic/beanLoad.png) 我新添加了一个模块 spring-huchao.可以再该模型下测试,或者新建子模块 3:一些七七八八的临时总结 * 3.1:容器初始化时,会触发BeanFactoryPostProcessor * 比如实现注解 @@Configuration的后置工厂处理器(ConfigurationClassPostProcessor) * 在工厂实例化完成之后,进行回调BeanFactoryPostProcessor接口,解析配置类中有@Bean标识的方法 * 并创建了代理类(实际上都是通过beanFactory.getBean获取到的bean实例) * 3.2:bean的创建,大体分成了2个步骤 * 3.2.1:bean实例化,通过3层缓存的方式,提示暴露创建好的bean(解决循环依赖) * 实际上通过构造函数注入bean导致的循环依赖问题无法被解决。 * 实例化的过程中其实了有很多的拓展点,比较明显的是FactoryBean。这个接口提供了一个机制允许外部应用直接创建bean的实例 * 3.2.2:bean的初始化(给bean的属性赋值),拓展点主要是。BeanPostProcessor * BeanPostProcessor的实现比如有AutowiredAnnotationBeanPostProcesso(been实例化完成之后,解析属性,获取bean中有@@Autowired标注的属性, * 最用在容器中获取对应类型的bean,用反射完成的注入) * CommonAnnotationBeanPostProcessor(解析用@PostConstruct @PreDestroy注释的方法,最后也是用反射回调) *3:总结,Spring 强大的能力来自BeanFactoryPostProcessor和BeanPostProcessor以及其他的一些拓展点. 初次看spring源码的类图,会被庞大的类图结构搞蒙,抽象出来的接口密密麻麻,但是仔细一琢磨接口再多也只是个方法声明,到了具体实现的子类中就是反映了这个实现类具有某种能力。 是一种is-a的概念。第一次读源码的时候先大概了解各个接口是干什么用的,那么其实现的子类就具有了什么功能,现在重接口定义的方法含义上面去做粗略的了解,后续在容器初始化的过程中 bean的实例化和初始化过程中去想起了各方法的实现,以及去感悟这种“恐怖”类图的作用。这只是我个人学习的一点经验之谈,如果描述的有毛病就当没看。。 参考学习教程 https://www.bilibili.com/opus/805532687270936662