Spring源码学习(一)

2020-05-08  本文已影响0人  Tcpieg

如何阅读spring源码

最近想学习一下spring,但是发现无从下手,看了一些网上的建议,决定这种方法试试。
https://www.jianshu.com/p/aae58cd13460
总结下来就是:

  1. 建议不要硬着头皮看spring代码,本身的代码800多m,就是不上班开始看也不知道什么时候看完。
  2. 了解完Spring架构、模块以及模块对应的功能后,可以针对性阅读部分源码。逐一攻破。
  3. Spring在代码设计中运用了大量的设计模式,可以去学习一下设计模式。
  4. 在这个页面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继承了AttributeAccessorBeanMetadataElement接口。

AttributeAccessor

这是一个属性访问者,它提供了访问属性的能力。AttributeAccessorSupport是实现AttributeAccessor的抽象类.

AttributeAccessor

BeanMetadataElement

BeanMetadataElement中只有一个方法,用来获取元数据元素的配置源对象:

BeanMetadataElement
BeanMetadataElement定义Bean元数据的顶层接口,由BeanMetadataAttribute实现。
BeanMetadataAttribute

BeanDefinition

BeanDefinition

AnnotatedBeanDefinition

AnnotatedBeanDefinition 继承了BeanDefinition,拓展了BeanDefinition接口的能力。

继承关系
上一篇下一篇

猜你喜欢

热点阅读