【spring框架】(二)控制反转(IOC)容器

忘是亡心i 2022-08-04 13:50 311阅读 0赞

核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

IOC:是一种相当优秀的设计思想,即“好莱坞”原则:不用你主动来找我,我会通知你。

1、IOC(inversion of control)

  1. IoC是一个重要的面向对象编程的法则,用来解决程序的耦合问题,是轻量级的Spring框架的核心。
  2. IOC是说对象的控制权限进行转移,转移到第三方。
  3. 具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例,使用new 方式,但在IOC容器里,创建被调用者的工作不再由调用者来完成,;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者。
  4. 有了IoC容器,依赖关系就变了,两个对象彼此不再直接联系,它们都依赖IoC容器了,依赖关系由主动依赖变成了被动。

2、IOC容器初始化包含三个步骤:定位、载入解析和注册。

  1. 下图是对IOC容器初始化的图示:

Center

以下以Spring容器为例进行说明。
定位:对资源文件(Spring的配置文件是:applicationContext.xml)的定位

载入解析:将资源文件载入内存,我们需要解析资源文件中的

  1. 配置文件中Bean的结构如下:

Center 1

解析分为三步:

  1. 1、对beanid等属性解析;
  2. 2、对beanproperty进行解析,将properties的值取出;
  3. 3、合并12的结果,组成一个完整的数据结构--BeanDefinition(这是spring 容器的定义类),在解析<Bean>元素过程中没有创建和实例化Bean对象,只是创建了Bean对象的定义类BeanDefinition,将<Bean>元素中的配置信息设置到BeanDefinition中作为记录,当依赖注入时才使用这些记录信息创建和实例化具体的Bean对象。

注册:将解析完整的数据结构(BeanDefinition)存放在容器中,不能重复。

依赖注入:将IOC容器中存放的数据结构(BeanDefinition),实例化被依赖对象,将依赖关系注入到调用对象中。

3、BeanFactory

  1. Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。
  2. 下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。Spring 框架使用 JavaBean 属性和配置数据,从而可管理对象之间的关系。
  3. BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));
  4. MyBean mybean = (MyBean) factory.getBean("mybean");

BeanFactory 支持两个对象模型。
单态模型:提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。
原型模型:确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。

发表评论

表情:
评论列表 (有 0 条评论,311人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring控制IOC

    IOC即为Inversion of Control,中文名称为控制反转。它是一种设计模式,用于降低代码耦合度,提高代码可维护性和可扩展性。 在面向对象编程中,对象之间的依赖关

    相关 spring Ioc(控制)

    简述: spring的核心有两部分:ioc和aop (1)ioc:控制反转,之前调用一个类中的不是静态的方法,创建类的对象 new 类,再调用。现在使用spring的ioc

    相关 Spring框架 IOC控制

    对象之间的依赖由容器建立,避免对象之间依赖由对象自身建立。可以用减少代码之间的耦合度。其中最常见的方式叫做依赖注入。 当A类中用到了B类的对象b,在没有IOC时需要在A的代