【Spring】IoC容器 控制反转 与 DI依赖注入 概念 第一期


Spring 和 SpringFramework概念

Spring官网

  • 广义的 Spring:Spring 技术栈(全家桶)
    • 广义上的 Spring 泛指以 Spring Framework 为基础的 Spring 技术栈。
    • 例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子项目的基础。
  • 狭义的 Spring:Spring Framework(基础框架)
    • 狭义的 Spring 特指 Spring Framework,通常我们将它称为 Spring 框架。
    • 提供的功能包括:依赖注入(Dependency Injection)、面向切面编程(AOP)、声明式事务管理(TX)…

Spring全家桶的其他框架都是以SpringFramework框架为基础!

SpringFramework框架结构图:
1

功能模块功能介绍
Core Container核心容器,在 Spring 环境下使用任何功能都必须基于 IOC 容器。
AOP&Aspects面向切面编程
TX声明式事务管理。
Spring MVC提供了面向Web应用程序的集成功能。

一、Spring IoC容器 核心概念

1.1 组件和组件管理概念

组件:可以复用的JAVA对象(unity封装的各种component组件)
1

  • 替我们创建组件的对象
  • 帮我们保存组件的对象
  • 帮助我们自动组装
  • 替我们管理事务
  • 协助我们整合其他框架

之前需要new才能使用的类对象,需要自己赋值等等的操作 ,都改成使用spring帮我们处理,IoC容器帮助我们管理组件…

Spring充当组件管理角色(IoC):
组件可以完全交给 Spring 框架进行管理,Spring框架替代了原有的new对象和对象属性赋值动作等!

Spring具体的组件管理动作包含:

  • 组件对象实例化
  • 组件对象属性赋值
  • 组件对象之间引用
  • 组件对象存活周期管理
  • 我们只需要编写元数据(配置文件)告知Spring 管理哪些类组件和他们的关系即可!
    注意:组件是映射到应用程序中所有可重用组件的Java对象,应该是可复用的功能对象!
  • 组件一定是对象
  • 对象不一定是组件
    综上所述,Spring 充当一个组件容器,创建、管理、存储组件,减少了我们的编码压力,让我们更加专注进行业务编写!

配置地狱?!

1.2 Spring IoC容器和容器实现

IoC—Inversion of Control,即“控制反转”。

  • 一种设计思想,IoC意味着将设计好的对象交给容器控制。
  • 传统JAVA 是 对象内部通过new进行创建对象,是程序主动去创建依赖对象;
  • 而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建

由 Spring 通过IoC容器来new,不再由我主动来new了。
之后我从容器里直接拿出对象用就好

1.2.1 普通和复杂容器

普通容器
只能用来存储,没有更多功能。

  • 数组
  • 集合:List
  • 集合:Set

复杂容器
Servlet 容器能够管理 Servlet(init,service,destroy)、Filter、Listener 这样的组件的一生,所以它是一个复杂容器。

名称时机次数
创建对象默认情况:接收到第一次请求 修改启动顺序后:Web应用启动过程中一次
初始化操作创建对象之后一次
处理请求接收到请求多次
销毁操作Web应用卸载之前一次
  • SpringIoC 容器也是一个复杂容器。
    它们不仅要负责创建组件的对象、存储组件的对象,还要负责调用组件的方法让它们工作,最终在特定情况下销毁组件。
  • 总结:
  • Spring管理组件的容器,就是一个复杂容器,不仅存储组件,也可以管理组件之间依赖关系,并且创建和销毁组件等!

1.2.2 SpringIoC容器介绍

  • Spring IoC 容器,负责实例化、配置和组装 bean(组件)。
  • 容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。
  • 配置元数据以 XML、Java 注解或 Java 代码形式表现。
  • 它允许表达组成应用程序的组件以及这些组件之间丰富的相互依赖关系。

应用程序类与配置元数据相结合:2

1.2.3 SpringIoC容器具体接口和实现类

SpringIoc容器接口

BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象,它是SpringIoC容器标准化超接口!

ApplicationContextBeanFactory 的子接口。它扩展了以下功能:

  • 更容易与 Spring 的 AOP 功能集成
  • 消息资源处理(用于国际化)
  • 特定于应用程序给予此接口实现,例如Web 应用程序的 WebApplicationContext
    简而言之, BeanFactory 提供了配置框架和基本功能,而 ApplicationContext 添加了更多特定于企业的功能。 ApplicationContextBeanFactory 的完整超集!
    ApplicationContext容器实现类
    1
类型名简介
ClassPathXmlApplicationContext通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象
FileSystemXmlApplicationContext通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象
AnnotationConfigApplicationContext通过读取Java配置类创建 IOC 容器对象
WebApplicationContext专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。

1

1.2.4 SpringIoC容器管理配置方式

Spring框架提供了多种配置方式:XML配置方式、注解方式和Java配置类方式

  1. XML配置方式:是Spring框架最早的配置方式之一,通过在XML文件中定义Bean及其依赖关系、Bean的作用域等信息,让Spring IoC容器来管理Bean之间的依赖关系。该方式从Spring框架的第一版开始提供支持。
  2. 注解方式:从Spring 2.5版本开始提供支持,可以通过在Bean类上使用注解来代替XML配置文件中的配置信息。通过在Bean类上加上相应的注解(如@Component, @Service, @Autowired等),将Bean注册到Spring IoC容器中,这样Spring IoC容器就可以管理这些Bean之间的依赖关系。
  3. Java配置类方式:从Spring 3.0版本开始提供支持,通过Java类来定义Bean、Bean之间的依赖关系和配置信息,从而代替XML配置文件的方式。Java配置类是一种使用Java编写配置信息的方式,通过@Configuration、@Bean等注解来实现Bean和依赖关系的配置。

主要是:配置类+注解方式

1.3 Spring IoC / DI概念总结

IoC控制反转 将 实例化对象控制权利 反转 交给 spring
因为 使用Ioc ,要用DI 管理内部数据引用

  • IoC容器

    Spring IoC 容器,

    • 负责实例化、配置和组装 bean(组件)核心容器。
    • 容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。
  • IoC(Inversion of Control)控制反转

    • IoC 主要是针对对象的创建调用控制而言的,
    • 也就是说,当应用程序需要使用一个对象时,再是应用程序直接创建该对象,而是由 IoC 容器来创建和管理
    • 即控制权由应用程序转移到 IoC 容器中,也就是“反转”了控制权。
    • 这种方式基本上是通过依赖查找的方式来实现的,
    • 即 IoC 容器维护着构成应用程序的对象,并负责创建这些对象。
  • DI (Dependency Injection) 依赖注入

    • DI 是指在组件之间传递依赖关系的过程中,将依赖关系在容器内部进行处理,
    • 这样就不必在应用程序代码中硬编码对象之间的依赖关系,实现了对象之间的解耦合
    • 在 Spring 中,DI 是通过 XML 配置文件或注解的方式实现的。
    • 它提供了三种形式的依赖注入:构造函数注入、Setter 方法注入和接口注入
      1

二、 Spring IoC / DI 实现步骤 简略

1.编写配置文件
2.实例化IoC容器
3. 获取Bean(组件)
在这里插入图片描述

2.1 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 此处要添加一些约束,配置文件的标签并不是随意命名 -->
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="..." [1] class="..." [2]>  
    <!-- collaborators and configuration for this bean go here -->
  </bean>

  <bean id="..." class="...">
    <!-- collaborators and configuration for this bean go here -->
  </bean>
  <!-- more bean definitions go here -->
</beans>

Spring IoC 容器管理一个或多个组件。这些 组件是使用你提供给容器的配置元数据(例如,以 XML <bean/> 定义的形式)创建的。

<bean /> 标签 == 组件信息声明

  • id 属性是标识单个 Bean 定义的字符串。
  • class 属性定义 Bean 的类型并使用完全限定的类名。

2.2 实例化IoC容器

//实例化ioc容器,读取外部配置文件,最终会在容器内进行IoC和DI动作
ApplicationContext context = 
           new ClassPathXmlApplicationContext("services.xml", "daos.xml");

2.3 获取Bean(组件)

ApplicationContext 是一个高级工厂的接口,能够维护不同 bean 及其依赖项的注册表。

通过使用方法 T getBean(String name, Class<T> requiredType) ,您可以检索 bean 的实例。

允许读取 Bean 定义并访问它们,如以下示例所示:

//创建ioc容器对象,指定配置文件,ioc也开始实例组件对象
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
//获取ioc容器的组件对象
PetStoreService service = context.getBean("petStore", PetStoreService.class);
//使用组件对象
List<String> userList = service.getUsernameList();

总结

自己实例化对象方式: (不考虑反射)

使用构造函数实例化,有参/无参构造

工厂模式实例化,静态/非静态工厂

不同的实例化方式对象和组件IOC的配置方式也不同

图解IoC配置流程:

1

技术体系结构

  • 单一架构

    • 一个项目,一个工程,导出为一个war包,在一个Tomcat上运行。也叫all in one。
    • 单一架构,项目主要应用技术框架为:Spring , SpringMVC , Mybatis
      1
  • 分布式架构

    • 一个项目(对应 IDEA 中的一个 project),拆分成很多个模块,每个模块是一个 IDEA 中的一个 module。
      • 每一个工程都是运行在自己的 Tomcat 上。
      • 模块之间可以互相调用。每一个模块内部可以看成是一个单一架构的应用。

1
分布式架构,项目主要应用技术框架:SpringBoot (SSM), SpringCloud , 中间件等

框架( Framework )

框架 = jar包 + 配置文件 {jar拥有功能 + 配置文件定制化}

框架已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用封装好的API可以省去很多代码编写,从而提高工作效率和开发速度。

组件交给Spring管理优势

  1. 降低了组件之间的耦合性:Spring IoC容器通过依赖注入机制,将组件之间的依赖关系削弱,减少了程序组件之间的耦合性,使得组件更加松散地耦合。
  2. 提高了代码的可重用性和可维护性:将组件的实例化过程、依赖关系的管理等功能交给Spring IoC容器处理,使得组件代码更加模块化、可重用、更易于维护。
  3. 方便了配置和管理:Spring IoC容器通过XML文件或者注解,轻松的对组件进行配置和管理,使得组件的切换、替换等操作更加的方便和快捷。
  4. 交给Spring管理的对象(组件),方可享受Spring框架的其他功能(AOP,声明事务管理)等
  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道格维克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值