经过十多天的学习,我的脑海中开始对spring框架有了基本的认识

        首先我了解了spring框架的几个基本的常见的类:BeanFactory、BeanDefinition、BeanFactoryPostProfessor、BeanPostProcessor、BeanDefinitionReader还有Aware有关接口

        他们的功能区在于spring的各个工作功能期

        首先无论是选择使用注解开发还是使用配置文件开发注册bean,spring都需要一个类去读取这些配置文件信息,那个那个就是BeanDefinitionReader的实现类,他提供了配置文件的读取功能。

        当spring读取完配置文件获取的信息需要有一个对象来存储,这个对象就是BeanDefinition对象,他的任务不是存储bean对象的id与对象键值对,而是存储bean对象的定义信息,比如属性,是否单例,是否懒加载,谁是初始化方法等。

        当拥有了bean的定义信息之后接下来实际上就可以创建对象了,但是有的定义信息是可以加工的。比如我们最常见的需要二次加工定义信息的bean:DataSource对象,我们经常使用外置配置文件去把数据库连接信息放到一个properties文件中,那么在写对象属性的value值时使用的就是${},那么BeanDefinitionReader读取到的信息就是这样原封不动的,这个信息就需要二次加工,那谁来完成这件事呢?也就是BeanFactoryPostProcessor。

        多个BeanFactoryPostProcessor对象将信息进行二次加工后将改装完成的真正信息传给了BeanFactory对象,BeanFactory对象拿到了这些定义信息后就可以创建对象了,创建的方式当然就是反射的方式。既然创建了对象那么下一步就是初始化对象。

        首先需要将属性填充进对象中,使用的是AbstractAutowireCapableBeanFactory的populateBean方法,将属性注入到bean对象中。

        其次,当注入属性时需要通过bean调用spring底层的一些属性时,就需要使用Aware接口来完成捕捉获取

        然后就是BeanPostProcessor了,比如我们在学习aop时,有些类需要使用代理模式来实现,所以在初始化对象时就需要使用以实例化了的对象来完成代理模式,此时的时机恰好。而初始化又分为两块:before和after,这个在学习spring的bean生命周期时学习过,在bean调用init-param方法的前后会依次调用BeanPostProcessor的before和after方法。所以流程是先执行BeanPostProcessor的before处理方法,然后使用自己配置的init-param方法,最后在调用BeanPostProcessor的after处理方法。

        这时,bean的初始化就完成了,在容器中的bean就可以随时拿来使用。