Spring IOC的自我理解和实现过程以及生命周期

目录
  1 .IOC 概述
  2 .IOC容器的设计
  3 .Spring IOC容器的定义和初始化
  4 .Beand的生命周期
  5 .IOC总结

IOC 概述

IOC(控制反转):也是一个发布Bean的容器

控制反转是个很抽象的东西,那就得了解谁控制谁?谁被反转了?

控制:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)

反转:传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象。

为什么是反转,而不是正转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转。对象的获取被反转了。

就比如:你做开发,负责商品交易模块的,但是交易涉及到财务模块,而你并不了解财务模块,所以也不能轻易处理,这时你期望的是:

  • 熟悉财务流程
  • 接口逻辑尽量简单,只需要调用就行
  • 通过简单描述就能获取到接口实例,且描述应该尽量简单

现实的实例和开发思想(IOC)也是很相似的:
  财务的接口对象并不是自己创建的,而是财务部门创建的,但是也达到了你的需要。而在潜意识中你觉得你对象应该由你主动创建,但事实上并不是你真正的需要,因为也许你对你需要的业务一点都不精通,这个时候把创建对象的主动权交给别人,这就是控制反转的概念。

控制反转的概念:控制反转是一种通过描述(在java中可以是XML或者注解)并通过第三方去产生或获取特定的对象的方式。

而在Spring实例中实现控制反转的是IOC容器,其实现方式是依赖注入(DI)。Spring就会提供IOC容器来管理对应的资源。就比如:财务方面的接口模块开发已经完成,只需要把财务模块发布到IOC容器中,然后将交易模块也发布IOC容器中,使用XML或者注解,配置接口之间依赖注入的关系,Spring就会将其进行管理。而测试也只需要在IOC容器中获取财务模块的内容就行。

这就是一种控制反转的理念。它最大的理念就是降低对象之间的耦合,对于系统中的一些类,具体如何实现并不需要去理解,只需要它有什么用就可以的。就是对象的产生依赖IOC容器,而不是开发者主动的行为。主动创建对象的模式,责任归于开发者。被动创建的模式下,责任归于IOC容器,这样被动的模式,我们就可以理解为对象被控制反转了。

IOC容器的设计

Spring IOC容器的设计主要是基于BeanFactory和ApplicationContext两个接口,IOC容器主要接口如图:
这里写图片描述
从这张图可以看出来BeanFactory为于设计的底层,ApplicationContext是其中的高级接口。

BeanFactory类的主要方法就是一些getBean的方法,参数可以是扩展接口也可以是父类,但是接口底下有多个实现类(类有多个子类)的时候,这时通过父类就无法获取到准确的实例,因为容器无法判断具体的实现类。
还有isSingleton方法:用于判断是否单例。如果为真,就是该Bean在IOC容器中是作为唯一实例存在的。
isPrototype反法和isSingleton方法相反,判断为真的时候,意思是当你从容器中获取Bean,容器就会为你生成一个新的实力。
默认情况下:Spring会为Bean创建一个单例,就是默认isSingleton返回为true,isPrototype返回为false。

Spring IOC容器的定义和初始化

Bean的定义:

  1. Resoure定位:
    IOC容器根据开发者的配置进行资源定位
  2. BeanDefinition载入:
    这个时候是将Resource定位到的资源文件的信息保存到Bean定义(BeanDefinition)中,此时并不会创建Bean实例
  3. BeanDefinition注册:
    将载入的信息,发布到IOC容器中,注意,此时任旧并不会创建Bean实例

Bean的初始化:
Spring Bean有个配置选项 – lazy-init,默认值为default,实际值为false,就是IOC容器默认会自动初始化Bean。如果设置为true的时候,就只有当我们使用IOC容器的getBean方法获取的时候,才会进行Bean的初始化。

Beand的生命周期

  1. 定义
  2. 初始化
  3. 依赖注入
  4. setBeanName
    如果实现了接口BeanNameAware接口的setBeanName方法,那么它就会调用这个方法
  5. setBeanFactory
    如果Bean实现了BeanFactoryWare接口的setBeanFactory方法,那么它就会调用这个方法
  6. setApplicationContext
    如果Bean实现了ApplicationContext接口的setApplicationContext方法,且IOC容器也必须是一个ApplicationContext接口的实现类,那么才会调用这个方法,否则不调用的。
  7. postProcessBeforeInitialization
    如果Bean实现了BeanPostProcess接口的postProcessBeforeInitialization方法,那么它就会调用这个方法
  8. afterPropertiesSet
    如果Bean实现了BeanFactoryPostProcess接口的afterPropertiesSet方法,那么它就会调用这个方法
  9. 自定义初始化方法
    如果自定义初始化方法,就调用已定义的初始化方法
  10. postProcessAfterInitialization
    如果Bean实现了BeanPostProcess接口的postProcessAfterInitialization方法,完成了这些调用,这个时候Bean就完成了初始化,那么Bean就生存在IOC容器中了,使用者就可以从中获取Bean的事物
  11. 生存期
  12. destroy
    如果Bean实现了DisposableBean接口的destroy方法,那么它就会调用这个方法
  13. 自定义销毁方法
    如果自定义销毁方法,就调用自定义方法

IOC总结

  对于IOC控制反转理解接口现实实例,会更好理解,控制反转只是一种思想模式,只是比较抽象带来理解困难,将抽象的事物现实化,就更加清晰。

  IOC容器就是为了管理Bean而服务的。

  注意掌握BeanFactory所定义的基本方法,因为BeanFactory是IOC的最为基础的底层设计

  Bean的生命周期,注意需要通过哪些生命周期接口和方法实现的,它允许我们自定义初始化和销毁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章