如何查看源码
Spring源码下载https://github.com/spring-projects/spring-framework/tags?after=v3.1.0.RC1
eclipse关联源码 自己百度吧
源代码结构组织
Build-spring-framework是整个Spring源代码的构建目录,里面是项目的构建脚本,如果要自己动手构建Spring,可以进入这个目录使用ANT进行构建。
l org.springframework.context是IoC容器的源代码目录
l org.springframework.aop是AOP实现的源代码目录
l org.springframework.jdbc是JDBC的源代码部分
l org.springframework.orm是O/R Mapping对应的源代码实现部分
SpringIOC源码分析
IOC初始化
1、 XmlBeanFactory(屌丝IOC)的整个流程
2、 FileSystemXmlApplicationContext 的IOC容器流程
1、高富帅IOC解剖
2、 设置资源加载器和资源定位
3、AbstractApplicationContext的refresh函数载入Bean定义过程:
4、AbstractApplicationContext子类的refreshBeanFactory()方法:
5、AbstractRefreshableApplicationContext子类的loadBeanDefinitions方法:
6、AbstractBeanDefinitionReader读取Bean定义资源:
7、资源加载器获取要读入的资源:
8、XmlBeanDefinitionReader加载Bean定义资源:
9、DocumentLoader将Bean定义资源转换为Document对象:
10、XmlBeanDefinitionReader解析载入的Bean定义资源文件:
11、DefaultBeanDefinitionDocumentReader对Bean定义的Document对象解析:
12、BeanDefinitionParserDelegate解析Bean定义资源文件中的<Bean>元素:
13、BeanDefinitionParserDelegate解析<property>元素:
14、解析<property>元素的子元素:
15、解析<list>子元素:
16、解析过后的BeanDefinition在IoC容器中的注册:
17、DefaultListableBeanFactory向IoC容器注册解析后的BeanDefinition:
IOC体系
BeanFactory
Spring Bean的创建是典型的工厂模式,这一系列的Bean工厂,也即IOC容器为开发者管理对象间的依赖关系提供了很多便利和基础服务,在Spring中有许多的IOC容器的实现供用户选择和使用,其相互关系如下:
BeanFactory
BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是Spring IOC 所遵守的最底层和最基本的编程规范。在 Spring 代码中, BeanFactory 只是个接口,并不是 IOC容器的具体实现,但是 Spring 容器给出了很多种实现,如 DefaultListableBeanFactory 、 XmlBeanFactory 、ApplicationContext 等,都是附加了某种功能的实现。
大体思路是 反射+DOM4J, 解析配置文件,通过beanId查找bean是否存在
存在的话,获取该节点class地址,使用反射机制初始化。
Spring 使用了很多抽象类
Spring核心jar包:
SpringCore -- Spring 核心jar
SpringContext--上下文IOC具体实现
Spring-Bean -- Spring实例
Spring-jdbc
SpringAOP
BeanFactory接口: ctrl+T
核心方法查看:
定义接口去进行规范
public interface BeanFactory { //这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象, //如果需要得到工厂本身,需要转义 //转义符“&”用来获取FactoryBean本身 String FACTORY_BEAN_PREFIX = "&"; //根据bean的名字进行获取bean的实例,这是IOC最大的抽象方法 Object getBean(String name) throws BeansException; //根据bean的名字和Class类型进行获取Bean的实例,和上面方法不同的是,bean名字和Bean 的class类型不同时候会爆出异常 <T> T getBean(String name, Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; //检测这个IOC容器中是否含有这个Bean boolean containsBean(String name); //判断这个Bean是不是单利 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; //判断这个Bean是不是原型 boolean isPrototype(String name) throws NoSuchBeanDefinitionException; //查询指定的bean的名字和Class类型是不是指定的Class类型 boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException; //这里对得到bean实例的Class类型 Class<?> getType(String name) throws NoSuchBeanDefinitionException; //这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来 String[] getAliases(String name); }
BeanDefinition
这个接口,可以理解为xml bean元素的数据载体。通过对比xml bean标签的属性列表和BeanDefinition的属性列表一看便知。
我的理解,是解析XML的过程,就是 xml <bean>元素内容 转换为BeanDefinition对象的过程。而且这个接口,支持层级,对应对象的继承。
有一个类BeanDefinitionHolder,BeanDefinitionHolder,根据名称或者别名持有beanDefinition,它承载了name和BeanDefinition的映射信息。
BeanWarpper:
提供对标准javabean的分析和操作方法:单个或者批量获取和设置属性值,获取属性描述符,查询属性的可读性和可写性等。支持属性的嵌套设置,深度没有限制。
AbstractRefreshableApplicationContext的refreshBeanFactory()这个方法
核心类:
核心方法:
这个接口主要做xml解析的
封装xml解析Spring Bean文件 (可以get出来个中属性哈哈)
看一个类:
点击进入这个抽象类 AbstractRefreshableApplicationContext
看它的方法:refreshBeanFactory()
protected final void refreshBeanFactory() throws BeansException { if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { DefaultListableBeanFactory beanFactory = createBeanFactory();//创建IOC容器 beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); loadBeanDefinitions(beanFactory);//载入loadBeanDefinitions synchronized (this.beanFactoryMonitor) { this.beanFactory = beanFactory; } } catch (IOException ex) { throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); } }
持续点击看,有xml的解析 和 bean的注册
很多方法写成了一个类
原文地址:https://www.cnblogs.com/toov5/p/10707251.html