Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 300|回复: 1

[默认分类] Spring IOC的自我理解和实现过程以及生命周期

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-4-24 11:27:00 | 显示全部楼层 |阅读模式

    目录
      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的定义:
      
      Resoure定位:
    IOC容器根据开发者的配置进行资源定位  
      BeanDefinition载入:
    这个时候是将Resource定位到的资源文件的信息保存到Bean定义(BeanDefinition)中,此时并不会创建Bean实例
      BeanDefinition注册:
    将载入的信息,发布到IOC容器中,注意,此时任旧并不会创建Bean实例
      
    Bean的初始化:
    Spring Bean有个配置选项 – lazy-init,默认值为default,实际值为false,就是IOC容器默认会自动初始化Bean。如果设置为true的时候,就只有当我们使用IOC容器的getBean方法获取的时候,才会进行Bean的初始化。

      Beand的生命周期

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

      IOC总结

      对于IOC控制反转理解接口现实实例,会更好理解,控制反转只是一种思想模式,只是比较抽象带来理解困难,将抽象的事物现实化,就更加清晰。
      IOC容器就是为了管理Bean而服务的。
      注意掌握BeanFactory所定义的基本方法,因为BeanFactory是IOC的最为基础的底层设计
      Bean的生命周期,注意需要通过哪些生命周期接口和方法实现的,它允许我们自定义初始化和销毁。

    回复

    使用道具 举报

    该用户从未签到

    发表于 2018-4-24 16:28:20 | 显示全部楼层
    很好,很好,真的很好
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-16 19:40 , Processed in 0.408945 second(s), 47 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表