开始造一个spring框架

先从基础开始造:

一.接口和类之间的关系图

二:任务:将xml中定义的bean全部交给spring容器进行管理;实现:1⃣️利用Dom4j解析xml文件生成BeanDefinition,2⃣️获取bean实例的时候通过反射进行获取

三:单一指责(SRP)  对于一个类来说,应该仅有一个引起它变的原因,如果有多余一个动机去改变一个类的话,这个类就具有多余一个指责,把多个指责耦合一起的话,一个变化可能会消弱这个类完成其他职责的能力。

四:基于单一指责,各个类的主要职责为:

1⃣️XmlBeanDefinitionReader:主要职责是通Dom4j解析xml,为spring容器生成一个个BeanDefinition

依赖:BeanDefinitionRegistry, 通过构造方法传入,该类有两个方法,获取BeanDefinition和注册BeanDefinition

方法

该方法传入一个Resource实例,里面有一个获取输入流的方法;其实现类为FileSystemResource和ClassPathResource

FileSystemResource是从系统文件中获取xml;ClassPathResource是从项目的资源文件中获取xml

2⃣️BeanFactory:是个接口,里面就一个方法,根据传入的beanID获取bean实例

该类有两个现实:ConfigurableBeanFactory和AbstractApplictionContext;ConfigurableBeanFactory中可以设置ClassLoader,这个ClassLoader主要用在通过反射创建bean实例和读取classpath下的资源,如果不传有个默认值

3⃣️DefaultBeanFactory:该类是集大成者,继承DefaultSingletonBeanRegistry,实现BeanDefinitionRegistry类中注册BeanDefiniton的方法和ConfigurableBeanFactory设置ClassLoader的方法

4⃣️DefaultSingletonBeanRegistry:spring单例实现的类,实现SingletonBeanRegistry

5⃣️ApplicationContext:提供给用户使用的类,一般用户通过这个获取bean,有两个实例ClassPathXmlApplication与FileSystemXmlApplicationContext;为了减小两个实现类中的代码重复,使用模版方法,加一个中间抽象类AbstractApplicationContext,有个抽象方法根据路径获取Resource

AbstractApplicationContext封装了DefaultBeanFactory(注册BeanDefinition,获取bean实例),封装了XmlBeanDefinitionReader解析xml文件;

然后ClassPathXmlApplication与FileSystemXmlApplicationContext只需要继承AbstractApplicationContext,实现其中的抽象方法getResourceByPath;

五:测试:对ApplicationContext、BeanFactory、Resource进行测试;具体见git:https://gitee.com/zhouyanxu/createSpring.git

六:未完待续,有时间再看再写

如何实现:注解比如@setter注入,构造函数注入等以及Aop实现

你可能感兴趣的:(开始造一个spring框架)