码迷,mamicode.com
首页 > 编程语言 > 详细

Spring IoC详解

时间:2020-04-09 21:34:59      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:框架   电话   prot   java   生活   第三方   单例   创建对象   lan   

Spring IoC 概述

IoC:Inverse of Control(控制反转)

  • 读作 “反转控制”,更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理
  • 正控:若要使用某个对象,需要自己去负责对象的创建
  • 反控:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架
  • 好莱坞法则: Don’t call me ,I’ll call you

一个例子

控制反转显然是一个抽象的概念,我们举一个鲜明的例子来说明。

在现实生活中,人们要用到一样东西的时候,第一反应就是去找到这件东西,比如想喝新鲜橙汁,在没有饮品店的日子里,最直观的做法就是:买果汁机、买橙子,然后准备开水。值得注意的是:这些都是你自己主动”创造的过程,也就是说一杯橙汁需要你自己创造。

技术图片

 

 

 然而到了今时今日,由于饮品店的盛行,当我们想喝橙汁时,第一想法就转换成了找到饮品店的联系方式,通过电话等渠道描述你的需要、地址、联系方式等,下订单等待,过一会儿就会有人送来橙汁了。

技术图片

 

 

 请注意你并没有“主动”去创造橙汁橙汁是由饮品店创造的,而不是你,然而也完全达到了你的要求,甚至比你创造的要好上那么一些。

Spring IoC 阐述

这就是一种控制反转的理念,上述的例子已经很好的说明了问题,我们再来描述一下控制反转的概念:控制反转是一种通过描述(在 Java 中可以是 XML 或者注解)并通过第三方(Spring)去产生或获取特定对象的方式。

  • 好处:
    降低对象之间的耦合
    我们不需要理解一个类的具体实现,只需要知道它有什么用就好了(直接向 IoC 容器拿)

主动创建的模式中,责任归于开发者,而在被动的模式下,责任归于 IoC 容器,基于这样的被动形式,我们就说对象被控制反转了。(也可以说是反转了控制)

Spring IoC 容器

Spring 会提供 IoC 容器来管理和容纳我们所开发的各种各样的 Bean,并且我们可以从中获取各种发布在 Spring IoC 容器里的 Bean,并且通过描述可以得到它。

技术图片

 

 

 

Spring IoC 容器的设计

Spring IoC 容器的设计主要是基于以下两个接口

  • BeanFactory
  • ApplicationContext

其中 ApplicationContext 是 BeanFactory 的子接口之一,换句话说:BeanFactory 是 Spring IoC 容器所定义的最底层接口ApplicationContext 是其最高级接口之一,并对 BeanFactory 功能做了许多的扩展,所以在绝大部分的工作场景下,都会使用 ApplicationContext 作为 Spring IoC 容器。

技术图片

BeanFactory

从上图中我们可以几乎看到, BeanFactory 位于设计的最底层,它提供了 Spring IoC 最底层的设计,为此,我们先来看看该类中提供了哪些方法:

                            技术图片

 

 

 

由于这个接口的重要性,所以有必要在这里作一下简短的说明:

  • 【getBean】 对应了多个方法来获取配置给 Spring IoC 容器的 Bean。
    ① 按照类型拿 bean
    bean = (Bean) factory.getBean(Bean.class);

注意: 要求在 Spring 中只配置了一个这种类型的实例,否则报错。(如果有多个那 Spring 就懵了,不知道该获取哪一个)
按照 bean 的名字拿 bean:
bean = (Bean) factory.getBean("beanName");
注意: 这种方法不太安全,IDE 不会检查其安全性(关联性)
③ 按照名字和类型拿 bean:(推荐)
bean = (Bean) factory.getBean("beanName", Bean.class);

  • 【isSingleton】 用于判断是否单例,如果判断为真,其意思是该 Bean 在容器中是作为一个唯一单例存在的。而【isPrototype】则相反,如果判断为真,意思是当你从容器中获取 Bean,容器就为你生成一个新的实例。

注意: 在默认情况下,【isSingleton】为 ture,而【isPrototype】为 false

  • 关于 type 的匹配,这是一个按 Java 类型匹配的方式
  • 【getAliases】方法是获取别名的方

这就是 Spring IoC 最底层的设计,所有关于 Spring IoC 的容器将会遵守它所定义的方法。

 

 

 

来源于:---->

 

Spring IoC详解

标签:框架   电话   prot   java   生活   第三方   单例   创建对象   lan   

原文地址:https://www.cnblogs.com/JonaLin/p/12669569.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!