Spring-IOC详解之注入

今天我们主要讲解一下Spring中的比较重要的一个模块——IOC。

1、IOC是什么?

IOC(Inversion of Control)也叫控制反转,是一种编程思维,而不是技术实现。IOC指的就是控制权的反转,用原来手动创建对象,转成java程序创建对象

  1. 传统的开发方式:类 A 中手动通过 new 关键字来 new 一个 B 的对象出来
  2. 使用IOC思维的开发方式:不通过 new 关键字来创建对象,而是通过IOC 容器(Spring 框架) 来帮助我们实例化对象。我们需要哪个对象,直接从IOC 容器里面过去即可。

从两种不同的开发方式对比来说:我们去创建、管理对象了,只需要修改容器。总结来说:对象是由Spring创建,管理,装配!

我们分别解析一下控制反转的意思:

  1. 控制:指的是对象创建(实例化、管理)的权力。这个权利从程序本身变为了Sping。
  2. 反转·:指的是控制权。程序本身不创建对象,而变成被动的接收spring创建的对象。

2、IOC容器

  1. IOC容器是Spring实现IOC的载体, IOC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。
  2. 想要使用IOC容器,首先要配置Bean,然后实例化容器。最主要的就是配置Bean,下面我们将具体讲解Bean的配置。

2.1、配置Bean

Bean是告诉 Spring 容器实例化、配置和组装应用程序中的对象。 是放在xml文件中的,如何配置Bean:

  1. 创建应用程序上下文:因为Bean是存放在XML文件中的,所以第一步就是创建XML。在资源文件夹中创建一个XML文件,文件命名可以自定义,并且需要将此XML文件设置为应用程序上下文,设置方式如下:
    在这里插入图片描述
    在这里插入图片描述

  2. 配置Bean:通过<bean>标签配置Bean,如下所示
    在这里插入图片描述
    在配置过程中需要给<bean>标签添加一些属性:

    • id属性:bean的唯一标识符,也就是相当于我们学的对象名
    • class属性:bean 对象所对应的全限定名:包名+类型
    • name属性:别名,而且同时name可以同时取多个别名,用逗号 ( ,)、分号 ( ; ) 或空格分隔
    • lazy-init属性:是将 bean 定义标记为延迟初始化来防止单例 bean 的预实例化,它有三个值——ture(确定延迟)、false(预先实例化)和default(默认)。
    • scope属性:详解见下Bean的作用域。
    • init-method属性:指定类中的初始化方法名称,在bean被实例化之后里面执行。
    • destroy-method属性:指定类中的销毁方法名称,在bean被销毁之后里面执行。

有关别名的补充,在XML中除了使用<Bean>标签上的name属性取别名,可以使用<alias>标签,具体使用方法如下:
在这里插入图片描述
上述图片中,我们使用name属性和<alias>标签对Bean取别名,在使用过程中我们可以使用user、user1、user2和user3四种名称。


在团队开发中,可能有多个人负责不同的开发,不同的类注册需要在不同的bean中,而在项目整合时需要进行整合。而在Spring中提供了一种整合Bean的方法,使用 <import>标签进行整合,使用方法如下:
在这里插入图片描述

2.2、对Bean进行依赖注入

在类中我们会有一些属性,而通过Bean实例化对象时,也属性给这些属性赋值。依赖注入有两种方式,具体方式入戏:

  1. <property>标签:使用这种标签是用set方法完成注入,既在类中通过set方法完成属性赋值,使用方法如下:
<bean id="..." class="...">
      <!--第一种,普通的value注入 String类型-->
    <property name="name" value="张三"/>
    <!--第二种,引用类型注入 类-->
    <property name="address" ref="address"/>
    <!--第三种,数组注入-->
    <property name="books">
        <array>
            <value>Spring</value>
       
        </array>
    </property>
    <!--第四种,list注入 List类型-->
    <property name="hobbys">
        <list>
            <value>java</value>
            <value>vue</value>
        </list>
    </property>
    <!--第五种,Map注入 Map类型-->
    <property name="card">
        <map>
            <entry key="id" value="0001"/>
        </map>
    </property>
    <!--第六种,set注入 Set类型-->
    <property name="games">
        <set>
            <value>springboot</value>
        </set>
    </property>
    <!--第七种,空值注入 String类型-->
    <property name="wife">
        <null/>
    </property>
    <!--第八种,properties注入-->
    <property name="info">
        <props>
            <prop key="name">王五</prop>
        </props>
    </property>
<bean/>
  1. <constructor-arg>标签:使用这种标签是通过有参构造的方式完成注入,既在类中通过有参构造完成属性赋值,使用方法如下:
<bean id="..." class="...">
    <!--下标赋值 -->
    <constructor-arg index="0" value="张三"/>
    <!--类型赋值(不建议使用) -->
    <constructor-arg type="java.lang.String" value="张三"/>
    <!--通过参数名来赋值 -->
    <constructor-arg name="name" value="张三"/>
</bean>
  1. 简化上面两种方式:既通过p命名空间和c命名空间完成,p标签注入和c标签注入需要在约束条件中加入一条约束代码,分别是xmlns:p=“http://www.springframework.org/schema/p”xmlns:c=“http://www.springframework.org/schema/c”。这两种命名空间只是简化了上面提到了两种标签。使用方法如下:
<!--源代码-->
<bean id="..." class="...">
     <property name="name" value="张三"/>
</bean>
<!--通过p命名注入,可以直接注入属性的值:properties-->
<bean id="..." class="..." p:name="张三" p:age="18"/>

 <!--通过c命名注入,通过构造器注入:construct-args-->
<bean id="..." class="..." c:name="盾山" c:age="19"/>

2.3、 Bean的作用域(sorce)

Bean的作用域(sorce)有singleton、prototype、request、session和application五种取值。其代表含义为:

  1. singleton:在spring IOC容器仅存在一个Bean实例,Bean以单例方式存在。是bean作用域范围的默认值,这个仅存的Bean实例创建时机为xml被加载的时候。
  2. prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,既创建时机为调用getBean方法实例化时。
  3. request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。
  4. session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。
  5. application:限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。

2.4、 IOC容器的使用

在配置完Bean之后,我们就要进行使用,其实使用方法很简单,只需要实例化IOC容器就行。而org.springframework.context.ApplicationContext接口代表了IOC容器。而实例化通常使用ClassPathXmlApplicationContext进行。实例化完成之后,使用getBean("名称")方法就行获取具体的Bean。具体代码如下

//获取带IOC容器,"services.xml", "daos.xml"为参数表示xml文件的地址,可以设置多个
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
//我们的对象现在都在Spring中管理了,我们要使用,直接去里面取出来即可,hello为需要创建的对象所在的类名,
Hello hello = (Hello) context.getBean("hello");
//或者使用
//Hello hello = context.getBean("hello",Hello.Class);
2.5、Bean实例化

Bean的实例化是通过IOC完成的,那么IOC到底是怎么实例化的呢。有三种方法:

  1. 构造函数实例化:IOC默认是使用这种方式就行的,通过无参构造完成。
  2. 静态工厂方法实例化
  3. 实例工厂方法实例化

实例化了解一下就可以,知道有三种方式就行。最只要的还是第一种,其他两种不做讲解。

本篇结束,这只是IOC容器的一部分知识,详情见Spring官网!如有错误请及时私信作者!

热门文章

暂无图片
编程学习 ·

exe4j详细使用教程(附下载安装链接)

一、exe4j介绍 ​ exe4j是一个帮助你集成Java应用程序到Windows操作环境的java可执行文件生成工具&#xff0c;无论这些应用是用于服务器&#xff0c;还是图形用户界面&#xff08;GUI&#xff09;或命令行的应用程序。如果你想在任务管理器中及Windows XP分组的用户友好任务栏…
暂无图片
编程学习 ·

AUTOSAR从入门到精通100讲(126)-浅谈车载充电系统通信方案

01 引言 本文深入研究车载充电系统策略,设计出一套基于电动汽车电池管理系统与车载充电机的CAN通信协议,可供电动汽车设计人员参考借鉴。 02 电动汽车充电系统通讯网络 电动汽车整车控制系统中采用的是CAN总线通信方式,由一个整车内部高速CAN网络、内部低速CAN网络和一个充电…
暂无图片
编程学习 ·

CMake(九):生成器表达式

当运行CMake时&#xff0c;开发人员倾向于认为它是一个简单的步骤&#xff0c;需要读取项目的CMakeLists.txt文件&#xff0c;并生成相关的特定于生成器的项目文件集(例如Visual Studio解决方案和项目文件&#xff0c;Xcode项目&#xff0c;Unix Makefiles或Ninja输入文件)。然…
暂无图片
编程学习 ·

47.第十章 网络协议和管理配置 -- 网络配置(八)

4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…
暂无图片
编程学习 ·

元宇宙技术基础

请看图&#xff1a; 1、通过AR、VR等交互技术提升游戏的沉浸感 回顾游戏的发展历程&#xff0c;沉浸感的提升一直是技术突破的主要方向。从《愤怒的小鸟》到CSGO,游戏建模方式从2D到3D的提升使游戏中的物体呈现立体感。玩家在游戏中可以只有切换视角&#xff0c;进而提升沉浸…
暂无图片
编程学习 ·

flink的伪分布式搭建

一 flink的伪分布式搭建 1.1 执行架构图 1.Flink程序需要提交给 Job Client2.Job Client将作业提交给 Job Manager3.Job Manager负责协调资源分配和作业执行。 资源分配完成后&#xff0c;任务将提交给相应的 Task Manage。4.Task Manager启动一个线程以开始执行。Task Manage…
暂无图片
编程学习 ·

十进制正整数与二进制字符串的转换(C++)

Function one&#xff1a; //十进制数字转成二进制字符串 string Binary(int x) {string s "";while(x){if(x % 2 0) s 0 s;else s 1 s;x / 2;}return s; } Function two&#xff1a; //二进制字符串变为十进制数字 int Decimal(string s) {int num 0, …
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统&#xff1a; 微信小程序——辩论管理前台涉及技术&#xff1a;WXML 和 WXS…
暂无图片
编程学习 ·

树莓派驱动DHT11温湿度传感器

1&#xff0c;直接使用python库 代码如下 import RPi.GPIO as GPIO import dht11 import time import datetimeGPIO.setwarnings(True) GPIO.setmode(GPIO.BCM)instance dht11.DHT11(pin14)try:while True:result instance.read()if result.is_valid():print(ok)print(&quo…
暂无图片
编程学习 ·

ELK简介

ELK简介 ELK是三个开源软件的缩写&#xff0c;Elasticsearch、Logstash、Kibana。它们都是开源软件。不过现在还新增了一个 Beats&#xff0c;它是一个轻量级的日志收集处理工具(Agent)&#xff0c;Beats 占用资源少&#xff0c;适合于在各个服务器上搜集日志后传输给 Logstas…
暂无图片
编程学习 ·

Linux 基础

通常大数据框架都部署在 Linux 服务器上&#xff0c;所以需要具备一定的 Linux 知识。Linux 书籍当中比较著名的是 《鸟哥私房菜》系列&#xff0c;这个系列很全面也很经典。但如果你希望能够快速地入门&#xff0c;这里推荐《Linux 就该这么学》&#xff0c;其网站上有免费的电…
暂无图片
编程学习 ·

Windows2022 无线网卡装不上驱动

想来 Windows2022 和 windows10/11 的驱动应该差不多通用的&#xff0c;但是死活装不上呢&#xff1f; 搜一下&#xff0c;有人提到 “默认安装时‘无线LAN服务’是关闭的&#xff0c;如果需要开启&#xff0c;只需要在“添加角色和功能”中&#xff0c;选择开启“无线LAN服务…
暂无图片
编程学习 ·

【嵌入式面试宝典】版本控制工具Git常用命令总结

目录 创建仓库 查看信息 版本回退 版本检出 远程库 Git 创建仓库 git initgit add <file> 可反复多次使用&#xff0c;添加多个文件git commit -m <message> 查看信息 git status 仓库当前的状态git diff 差异对比git log 历史记录&#xff0c;提交日志--pret…
暂无图片
编程学习 ·

用Postman生成测试报告

newman newman是一款基于nodejs开发的可以运行postman脚本的工具&#xff0c;使用Newman&#xff0c;可以直接从命令运行和测试postman集合。 安装nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 选择自己系统相对应的版本内容进行下载&#xff0c;然后傻瓜式安…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…