spring源码学习笔记之概览(一)

379 阅读2分钟

先上一张spring源码概览的图,后面的源码学习基本可以按照这张图按图索骥的去看了。

image.png

spring最基础的是作为IOC的容器,最常用的使用如下,先通过配置文件(或者通过注解)定义bean

<beans>
    <bean id=? class=? abstract init-method scope dependon.....>
        <property name=? value=?/>
        <property name=?ref=?/>
    </bean>

    <bean id=? class=? abstract init-method scope dependon.....>
        <constructor-arg name=? value=?/>
        <constructor-arg name=?ref=?/>
    </bean>
</beans>

通过以下方式就可以获取bean并调用bean的方法:

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
XXX xxx = ac.getBean(XXX.class);
xxx.method();

spring的加载bean过程:

image.png spring是用Map来存放生成的bean,我们在获取bean的时候,可以通过byName、byType的方式,所以会有key:String,value:Object的键值对,也有key:Class,value:Object的键值对.key:String,value:BeanDefinition是存储bean的定义信息。key:String,value:ObjectFactory三级缓存的时候会用到。

BeanDefinition 是存储bean的定义信息,我们可以大致看一下

image.png 大部分方法基本都是xml中定义bean的时候会用到的成员属性。例如:DependsOn、InitMethodName。 其实有 BeanDefinition了就可以通过反射的方式区生成bean了(new 也可以生成bean,单new的方式没有反射的方式灵活,通过反射可以拿到一个类的所有的成员变量,方法)。 利用反射的方式获取对象实例,需要先获取Class对象,Class对象可以通过这三种方式获取:

image.png 有了Class,通过以下代码即可获取对象实例:

Constructor ctor = clazz.getConstructor();
Object obj  = ctor.newInstance();
  • BeanFactory

BeanFactory Bean工厂,整个容器的根接口,也是容器的入口

image.png 后面比较常见到的bean工厂是,DefaultListableBeanFactory DefaultListableBeanFactory类图:

image.png

  • 在容器创建过程中需要动态的改变bean的信息怎么办? 比如我们经常在配置文件中写的 <property name=url value=${jdbc.url}>,在生成bean的时候,value值肯定是需要被替换的?那如果想随时修改beanDeifinition怎么办? 这就需要 PostProcessor 来处理。

image.png

  • 创建对象过程 创建对象分为对象实例化,对象的初始化

image.png