先上一张spring源码概览的图,后面的源码学习基本可以按照这张图按图索骥的去看了。
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过程:
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的定义信息,我们可以大致看一下
大部分方法基本都是xml中定义bean的时候会用到的成员属性。例如:DependsOn、InitMethodName。 其实有 BeanDefinition了就可以通过反射的方式区生成bean了(new 也可以生成bean,单new的方式没有反射的方式灵活,通过反射可以拿到一个类的所有的成员变量,方法)。 利用反射的方式获取对象实例,需要先获取Class对象,Class对象可以通过这三种方式获取:
有了Class,通过以下代码即可获取对象实例:
Constructor ctor = clazz.getConstructor();
Object obj = ctor.newInstance();
- BeanFactory
BeanFactory Bean工厂,整个容器的根接口,也是容器的入口
后面比较常见到的bean工厂是,DefaultListableBeanFactory
DefaultListableBeanFactory类图:
- 在容器创建过程中需要动态的改变bean的信息怎么办?
比如我们经常在配置文件中写的
<property name=url value=${jdbc.url}>
,在生成bean的时候,value值肯定是需要被替换的?那如果想随时修改beanDeifinition怎么办? 这就需要 PostProcessor 来处理。
- 创建对象过程 创建对象分为对象实例化,对象的初始化