1. Spring的作用
在spring里面最主要的功能就是Ioc(控制反转)和Aop(面向切面编程)。Ioc主要是把对象的产生的交给Spring进行管理,及把对象的依赖关系转化为用配置文件进行管理。那么问题来了spring如何实现Ioc呢?Aop又与Ioc有什么关系呢?
2.Spring的组织架构
分析:从这个spring架构图中可以看出。spring最核心的组件是Context和Core,Beans,这三个组件主要是干什么的呢?Beans就是Object(数据),Context是为这些bean提供生存条件,来发现和维护每一个bean之间的关系,这种关系集合叫做Ioc容器,发现和维护bean需要许多工具,这些工具就是core,这种最核心就是Bean,可以把spring说成面向Bean编程
3. 核心组件的认识
3.1 Beans是这里面最核心的组件,如果没有Bean就没有对应的Spring,那么这个Beans组件是如何进行设计的呢?在
Spring的bean包下,我们可以看到主要它做了三件事,分别是bean的定义,创建,bean的解析,这里面我们最关心的就是bean的创建。
通过分析可以的BeanFactory是根接口,继承它的有三个子类,分别对象可列表的bean,自动装载的bean,可继承的bean,最终的实现类就是 DefaultListableBeanFactory。
其实我们可以想一下,spring首先要做的事情就是先解析我们的配置文件或者读取我们的配置信息,然后对把读取到的bean进行管理,这就是spring对bean管理的大体思路。
那么我们就从源码开始分析。
1. spring对配置文件的解析和对bean的装载。
我们可以从XmlBeanFactory作为切入点,来详细分析spring如何加载配置文件,并且对它进行解析
2. spring对让我们如何getBean(),这可能是我们比较关注的地方,我们就从这里入手。
分析:我们前面已经知道DefaultListableBeanFactory是最终实现类,那么我们进行应该在这里面找getBean(),
分析:发现我们在DefaultListableBeanFactory看到它对父类的方法进行的覆盖。所以我们需要找到它的父类。
分析:我们发现这个方法的具体实现在AbstractBeanFactory类里面。
分析:这个方法主要我们得到单例的bean,先从缓存里面去,然后再从单例的bean工厂里面获取。
分析:如果没有找到bean,它会帮助我们创建bean。
. spring里面如何创建Bean?(单例)
1. 可以bean定义的信息,对bean进行实例化(工厂方法和无参构造函数),是通过java的反射机制。
2. 对bean属性值进行注入
3. BeanPostProcessor里面的ProcessBeforeInitation和bean进行关联,那么将会调用ProcessorBeforeInitation()
4. Bean定义的文件里面如果有init-method方法,这时候将会产生调用。
5. BeanPostProcessor里面的ProcessAftoreInitation和bean进行关联,那么将会调用ProcessorAftoreInitation(),这时候bean 已经在bean的工厂里面了,可以被使用
3.bean产生(其实就是bean的生命周期)
3.1 容器将找到bean的定义信息然后将其实例化
3.2 按照bean的定义信息将bean属性注入
3.3 如果bean实现了BeanNameAware的接口,将会调用setBeanName()方法传入Bean的id
3.4 如果bean实现BeanFactoryAware的接口,将会调用setBeanFactory的方法传入到工厂里面
3.5 BeanPostProcessor里面的ProcessBeforeInitation和bean进行关联,那么将会调用ProcessorBeforeInitation()
3.6 Bean定义的文件里面如果有init-method方法,这时候将会产生调用。
3.7 BeanPostProcessor里面的ProcessAftoreInitation和bean进行关联,那么将会调用ProcessorAftoreInitation(),这时候bean已经在bean的工厂里面了,可以被使用。
3.8 bean生命的结束可以通过bean实现DisposableBean接口,或者在bean的配置文件里面定义destroy-method方法。
4. FactoryBean和BeanFactory之间的区别?
FactoryBean和BeanFactory都是接口
BeanFactory是进行Bean的创建,管理,它是一个根据接口,实现它的有很多种类,例如像xmlBeanFacto对xml文件进行管理
然后生成对应的Bean
FactoryBean是一个对Bean进行包装处理,它就像java里面装饰者模式