美文网首页
Spring源码学习(一)

Spring源码学习(一)

作者: Tcpieg | 来源:发表于2020-05-08 17:20 被阅读0次

    如何阅读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接口的能力。

    继承关系

    相关文章

      网友评论

          本文标题:Spring源码学习(一)

          本文链接:https://www.haomeiwen.com/subject/ruifnhtx.html