Spring源码学习(一)
2020-05-08 本文已影响0人
Tcpieg
如何阅读spring源码
最近想学习一下spring,但是发现无从下手,看了一些网上的建议,决定这种方法试试。
https://www.jianshu.com/p/aae58cd13460
总结下来就是:
- 建议不要硬着头皮看spring代码,本身的代码800多m,就是不上班开始看也不知道什么时候看完。
- 了解完Spring架构、模块以及模块对应的功能后,可以针对性阅读部分源码。逐一攻破。
- Spring在代码设计中运用了大量的设计模式,可以去学习一下设计模式。
- 在这个页面code4craft/tiny-spring下载下来所有step1--step10所有的项目,全部导入到工程,看看作者是怎样一步步把spring整个框架搭起来的,然后对照着框架的源代码,逐一攻破
IOC
BeanDefinition
在Java中,一切皆对象。在JDK中使用java.lang.Class来描述类这个对象,但是引入实现的类意味着依赖。而Bean
的存在就是为了减轻依赖,想知道他们之间的区别,可以看一下这篇:为什么要使用Spring
Spring使用BeanDefinition
来描述Bean
。
step-1项目的代码
源代码较为复杂,我们可以先从这个项目开始,理解BeanDefinition
的原理。
首先定义一个BeanDefinition类
public class BeanDefinition {
private Object bean;
public BeanDefinition(Object bean) {
this.bean = bean;
}
public Object getBean() {
return bean;
}
}
所有的Bean
都由BeanFactory
来管理,也就是工厂类,所以定义一个BeanFactory类,将Bean
放在 map
里进行管理。
public class BeanFactory {
private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>();
public Object getBean(String name) {
return beanDefinitionMap.get(name).getBean();
}
public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
beanDefinitionMap.put(name, beanDefinition);
}
}
我们来测试一下,首先定义一个HelloWorld
类。
ublic class HelloWorld {
public void say() {
System.out.println("Hello World!");
}
}
运行一下
public class test {
public static void main(String[] args) {
// 1.初始化beanfactory
BeanFactory beanFactory = new BeanFactory();
// 2.注入bean
BeanDefinition beanDefinition = new BeanDefinition(new HelloWorld());
beanFactory.registerBeanDefinition("helloWorld", beanDefinition);
// 3.获取bean
HelloWorld helloWorld = (HelloWorld) beanFactory.getBean("helloWorld");
helloWorld.say();
}
}
spring源代码
当然spring框架里不会这么简单,但是原理是一样的,我们在源码中找到BeanDefinition
接口。BeanDefinition
继承了AttributeAccessor
和BeanMetadataElement
接口。
AttributeAccessor
这是一个属性访问者,它提供了访问属性的能力。AttributeAccessorSupport
是实现AttributeAccessor
的抽象类.
BeanMetadataElement
BeanMetadataElement
中只有一个方法,用来获取元数据元素的配置源对象:
BeanMetadataElement
定义Bean元数据的顶层接口,由BeanMetadataAttribute
实现。BeanMetadataAttribute
BeanDefinition
BeanDefinitionAnnotatedBeanDefinition
AnnotatedBeanDefinition
继承了BeanDefinition
,拓展了BeanDefinition
接口的能力。