Spring Framework(3)-IOC与DI总结

【SpringBoot 4.x 第8节】夯爆了,依赖注入:从 new 对象到交给 Spring 管理! 🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一定 Java 基础,但尚未系统学习 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,带你从第一个 Hello API 开始,逐步完成一个可部署、可监控、可扩展的后端项目。 阅读详情

点击查看更多Spring文章

目录

一.基本概念

1.什么是Spring IOC

2.IOC和DI有什么区别

二.DI的具体使用

1.使用Maven搭建Spring环境

2.通过id从Spring容器获取Bean(实例化Bean)

1.简单使用

2.bean标签详解

3.构造函数注入

4. set 方法注入

5. 使用 p 名称空间注入数据(本质还是调用 set 方法)

6.注入集合属性


 

一.基本概念

1.什么是Spring IOC

IOC指的是Inverse Of Control,即控制反转,它不是一种技术,而是一种思想。指的是将原先要由开发者手动创建的对象交由Spring来管理和创建,其核心是IOC容器,实质是一个存放着各种对象的Map,这样做的目的是解耦合。

解耦合不代表着对象之间完全没有关联,而是存在一种弱关联关系,而不是强关联关系。如下面的齿轮:强关联齿轮改变了任何一个齿轮,其他齿轮都需要和它配合改变;而弱关联齿轮由于存在着中间适配齿轮的作用,其他齿轮改变了只需要和中间齿轮适配就可以了,不需要改变所有齿轮。

 

 

2.IOC和DI有什么区别

DI指的是Dependency Injection,即依赖注入,它是Spring实现控制反转的基础,一般可以通过构造方法注入、setter方法注入。

依赖注入有什么好处

依赖注入最大的作用是松掉上层类与下层依赖类的耦合,使我们无需从下层类开始手动地创建直到上层类,而是通过依赖注入关系,先创建上层类,再层层往下去创建所需的下层类依赖。这一系列过程都依赖于Spring IOC核心容器。 

二.DI的具体使用

1.使用Maven搭建Spring环境

https://blog.youkuaiyun.com/lom9357bye/article/details/72796668

2.通过id从Spring容器获取Bean(实例化Bean)

1.简单使用

  • DemoDao/DemoDaoImp
public interface DemoDao {
    void print();
}

public class DemoDaoImp implements DemoDao {
    @Override
    public void print() {
        System.out.println("DemoDaoImp print hello world");
    }
}
  • DemoService/DemoServiceImp
public interface DemoServive {
    void print();
}


public class DemoServiceImp implements DemoServive {
    // 手动创建
    private DemoDao dao = new DemoDaoImp();

    @Override
    public void print() {
        dao.print();
    }
}
  • applicationContext.xml
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    在Spring容器中注册DemoDaoImp-->
    <bean id="demoDao" class="spring_demo.demo.DemoDaoImp">
    </bean>
<!--    在Spring容器中注册DemoServiceImp-->
    <bean id="demoService" class="spring_demo.demo.DemoServiceImp">
    </bean>

</beans>
  • TestDemo
@Test
    public void testACGetBean() {
        // 获取AC
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 使用AC通过id获取bean
        // 获取DemoDaoImp
        DemoDao demoDao = (DemoDao)ac.getBean("demoDao");
        System.out.println(demoDao);
        // 获取ServiceDaoImp
        DemoServive demoService = (DemoServive)ac.getBean("demoService");
        System.out.println(demoService);
        // 执行DemoDaoImp方法
        demoService.print();
    }

打印

信息: Loading XML bean definitions from class path resource [applicationContext.xml]
spring_demo.demo.DemoDaoImp@58c1670b
spring_demo.demo.DemoServiceImp@6b57696f
DemoDaoImp print hello world

2.bean标签详解

<bean>的作用是在Spring中注册对象,它有以下可选属性:

1. id

用于作为类的唯一标识,建议使用

2. name

用于作为类名称标识,不建议使用

3. class

指定类的全限定名,用于Spring容器创建对象

4. scope

对象的作用域,默认为singleton(单例)的,可以使用prototype指定为多例。当使用singleton模式时,bean在容器创建时立即创建(饿汗式),在容器销毁时销毁,和容器生命周期一致。当使用prototype模式时,bean在使用时创建,在使用完毕后,被JVM垃圾回收。

5. init-method

指定对象创建时执行的方法

6. destroy-method

指定对象销毁时执行的方法

3.构造函数注入

顾名思义,就是使用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置 的方式,让 spring 框架来为我们注入。具体代码如下:

public class AccountServiceImpl implements IAccountService {
    private String name;
    private Integer age;
    private Date birthday;
public AccountServiceImpl(String name, Integer age, Date birthday) {
    this.name = name;
    this.age = age;
    this.birthday = birthday;
}
@Override
public void saveAccount() {
    System.out.println(name+","+age+","+birthday);
}
}
<!-- 使用构造函数的方式,给 service 中的属性传值
要求:
类中需要提供一个对应参数列表的构造函数。
涉及的标签:
constructor-arg
属性:
index:指定参数在构造函数参数列表的索引位置
type:指定参数在构造函数中的数据类型
name:指定参数的名称
value:它能赋的值是基本数据类型和 String 类型
ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean
-->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
    <constructor-arg name="name" value="张三"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>

<bean id="now" class="java.util.Date"></bean>

4. set 方法注入

顾名思义,就是在类中提供需要注入成员的 set 方法。具体代码如下:

public class AccountServiceImpl implements IAccountService {
private String name;
private Integer age;
private Date birthday;

public void setName(String name) {
    this.name = name;
}
public void setAge(Integer age) {
    this.age = age;
}
public void setBirthday(Date birthday) {
    this.birthday = birthday;
}
@Override
public void saveAccount() {
    System.out.println(name+","+age+","+birthday);
}
}
<!-- 通过配置文件给 bean 中的属性传值:使用 set 方法的方式
涉及的标签:
property
name:找的是类中 set 方法后面的部分
ref:给属性赋值是其他 bean 类型的
value:给属性赋值是基本数据类型和 string 类型的
实际开发中,此种方式用的较多。
-->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
    <property name="name" value="test"></property>
    <property name="age" value="21"></property>
    <property name="birthday" ref="now"></property>
</bean>

<bean id="now" class="java.util.Date"></bean>

5. 使用 p 名称空间注入数据(本质还是调用 set 方法)

此种方式是通过在 xml 中导入 p 名称空间,使用 p:propertyName 来注入数据,它的本质仍然是调用类中的 set 方法实现注入功能。

public class AccountServiceImpl4 implements IAccountService {
private String name;
private Integer age;
private Date birthday;

public void setName(String name) {
    this.name = name;
}
public void setAge(Integer age) {
    this.age = age;
}
public void setBirthday(Date birthday) {
    this.birthday = birthday;
}
@Override
public void saveAccount() {
    System.out.println(name+","+age+","+birthday);
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="accountService"
class="com.itheima.service.impl.AccountServiceImpl4"
    p:name="test" p:age="21" p:birthday-ref="now"/>
</beans>

6.注入集合属性

顾名思义,就是给类中的集合成员传值,它用的也是 set方法注入的方式,只不过变量的数据类型都是集合。 我们这里介绍注入数组, List,Set,Map,Properties。具体代码如下:

public class AccountServiceImpl implements IAccountService {
private String[] myStrs;
private List<String> myList;
private Set<String> mySet;
private Map<String,String> myMap;
private Properties myProps;

public void setMyStrs(String[] myStrs) {
    this.myStrs = myStrs;
}
public void setMyList(List<String> myList) {
    this.myList = myList;
}
public void setMySet(Set<String> mySet) {
    this.mySet = mySet;
}
public void setMyMap(Map<String, String> myMap) {
    this.myMap = myMap;
}
public void setMyProps(Properties myProps) {
    this.myProps = myProps;
}
@Override
public void saveAccount() {
    System.out.println(Arrays.toString(myStrs));
    System.out.println(myList);
    System.out.println(mySet);
    System.out.println(myMap);
    System.out.println(myProps);
}
}
<!-- 注入集合数据
List 结构的:
array,list,set
Map 结构的
map,entry,props,prop
-->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
<!-- 在注入集合数据时,只要结构相同,标签可以互换 -->
<!-- 给数组注入数据 -->
<property name="myStrs">
<set>
    <value>AAA</value>
    <value>BBB</value>
    <value>CCC</value>
</set>
</property>
<!-- 注入 list 集合数据 -->
<property name="myList">
<array>
    <value>AAA</value>
    <value>BBB</value>
    <value>CCC</value>
</array>
</property>
<!-- 注入 set 集合数据 -->
<property name="mySet">
<list>
    <value>AAA</value>
    <value>BBB</value>
    <value>CCC</value>
</list>
</property>
<!-- 注入 Map 数据 -->
<property name="myMap">
<props>
    <prop key="testA">aaa</prop>
    <prop key="testB">bbb</prop>
</props>
</property>
<!-- 注入 properties 数据 -->
<property name="myProps">
<map>
    <entry key="testA" value="aaa"></entry>
    <entry key="testB">
    <value>bbb</value>
</entry>
</map>
</property>
</bean>
Spring 6【什么是Spring 6、Spring框架介绍 、Spring IoC/DI 详解 】(一)-全面详解(学习总结---从入门到深化) Spring 6【什么是Spring 6、Spring框架介绍、Spring IoC/DI 详解】(一)-全面详解(学习总结---从入门到深化) 阅读详情

相关推荐

Spring 6【Spring Framework中的IoC/DI、IoC/DI的优缺点 、第一个Spring Framework 案例】(二)-全面详解(学习总结---从入门到深化)

Spring 6【Spring Framework中的IoC/DI、IoC的具体实现框架有哪些、IoC/DI的优缺点、IoC/DI在项目中具体应用场景、BeanFactory和ApplicationContext、第一个Spring Framework 案例】(二)-全面详解(学习总结---从入门到深化)

542

SpringIOC和DI简单总结

Spring 一、SpringIOC Inversion of controll:控制反转。在web阶段,service层需要使用到dao,那么直接自己来new一个对象出来,进行使用。但是这种方式来创建,耦合度高。第一个优点就是解耦,因为springIOC就是做到了控制反转的作用,不需要自己来new对象,而是配置一下,交给spring框架自己来创建。所以使用spring框架了之后,创建对象就交给了spring框架,我们需要做到的事情就是配置而已。 创建bean有三种方式: 第一种方式: public cla

weixin_44023129的博客 345

浅谈车载控制器产线EOL实现方式

1、控制器生产产线上电路检测设计 2、客户总装产线检测设计

u012406840的博客 2万+

对Spring的IoC和DI最生动的解释

这是我以前复制下来的,原文地址已经找不到了。作者写得太生动了!         首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然

Mars学IT 1364

从零开始掌握RDMA拥塞控制:原理、算法与实战解析

本文深入解析了RDMA拥塞控制的核心原理与实战配置。RDMA依赖无损网络保障高性能,其关键在于PFC与ECN两大技术协同防止丢包。文章重点剖析了主流算法DCQCN的工作机制与参数调优,并简要介绍了HPCC与TIMELY等前沿算法。最后提供了在Linux上配置RoCEv2与DCQCN的详细步骤及性能调试方法,帮助读者从零构建稳定的RDMA网络环境。

weixin_28452161的博客 137

用Python+OpenCV搞定线激光相机标定:从棋盘格到3D点云的保姆级实战

本文详细介绍了使用Python和OpenCV进行线激光相机标定的全流程实战,从硬件准备到3D点云重建。涵盖相机内参标定、激光平面方程拟合、三维重建等关键技术,提供完整的代码实现和工程优化建议,帮助开发者实现毫米级精度的工业检测和三维测量系统。

weixin_29227425的博客 287

Spring-XML配置文件(IOC实验总结)

1.概述 XML格式的容器信息管理方式是Spring提供的最为强大,支持最全面的方式。在之前的文章中,关于配置文件进行几个小实验,这篇文章将会进行总结。 2.设置配置文件 2.1 <beans> 所有使用XML文件进行配置信息加载的IOC容器,包括BeanFactory和ApplicationContext的所有XML相应实现,都使用统一的XML格式。从Spring2.0版本之...

努力找工作呀 712

从数字后端角度谈谈occ电路(一)

摘要:本文介绍了芯片测试中OCC(On-Chip Clock Control)电路的设计与应用。随着工艺进步,芯片制造面临Stuck-at、Bridging和Delay等故障类型,需要不同时钟频率进行测试。OCC电路通过Clock Selection、Clock Chopping Control和Clock Gating三个模块,实现ATE时钟与PLL时钟的切换控制,支持慢速时钟检测Stuck-at故障和快速时钟检测Delay故障。文章详细解析了OCC电路结构及各模块功能,包括同步单元、移位寄存器等关键组件

芯冰乐 586

Spring01——Spring简介、Spring Framework架构、Spring核心概念、IOC入门案例、DI入门案例

Spring01——Spring简介、Spring Framework架构、Spring核心概念、IOC入门案例、DI入门案例

后端小白个人学习记录 1591

Zephyr内核——内存管理——内存堆

Zephyr提供了一组允许线程动态分配内存。

wayne2018的博客-心情驿站 773

cesium 淹没分析

cesium淹没分析

God's asylum的博客 482

Spring Framework入门:IOC与DI

Spring Framework入门:IOC与DI介绍与配置

2401_83516802的博客 677

Carla运行显示The following component(s) are required to run this program:DirectX Runtime |nvapi64.dll没有被

Carla运行显示The following component(s) are required to run this p 参考: 【1】EPIC 启动游戏提示The following component(s) are required to run this program:... - 『悬赏问答区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cnhttps://www.52pojie.cn/thread-1485651-1-1.html ...

anananajiushiwo的博客 5万+

Spring ---IOC容器和DI的具体应用

Spring Framework(Spring框架)是Spring生态系统的核心,它是一个开源的Java应用程序框架,由SpringSource公司开发,旨在简化企业级应用程序的开发。Spring Framework提供了依赖注入(DI)、面向切面编程(AOP)、声明式事务管理(TX)等功能,以解决企业级开发中的常见问题。它不仅使开发过程更加高效和便捷,还被广泛应用于Java企业开发领域。

qq_62374596的博客 1550

PCB层叠结构与阻抗计算

1.Core 和 PP PCB两个重要组成部分:Core 和 Prepreg(半固态片,简称PP)。 如下图所示, Core 的两个表面都铺有铜箔,可作为信号层、电源层、地层等导电层,Core的上下表面之间填充的是固态材料; PP的表面不铺铜,在PCB中起填充作用,其材质是半固体的树脂材料,因此比Core略软一些。 在制作多层板时,需配合使用Core和PP,一般在两个Core 之间应选PP作为填...

sinat_15677011的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Spring FrameWork IOC

其中,主要包括:1.支持IOC(控制反转)和AOP(面向切面编程)的容器 2.支持JDBC和ORM的数据访问模块(主要是针对sql) 3.支持声明式事务模块 4.支持基于Servlet的MVC开发 5.基于Reactive的web开发6.集成JMS、Java Mail、JMX及缓存等其他模块所以,java spring可以说是覆盖了整个程序编程的一个框架,

m0_65376383的博客 1005

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Java EE】Spring IoC 与 DI

本文主要介绍了Spring框架的核心概念及其组件关系: Spring体系:Spring是底层IoC容器,提供基础能力;Spring MVC专注Web开发;Spring Boot简化配置,实现快速搭建。三者在分层架构中协作处理请求。 IoC控制反转:通过将对象创建与依赖管理交给容器,解决传统开发的高耦合问题。示例展示了从手动new依赖到IoC解耦的演进,突出容器统一管理的优势。 DI依赖注入:作为IoC的实现手段,通过@Autowired动态注入依赖。结合@Component注册Bean,形成自动装配的依赖链

记录了从0学习Java技术栈的日常 508

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring Framework---IOC/DI

首先获取IOC容器,使用ClassPathXmlApplicationContext()方法对配置文件applicationContext.xml进行加载,new出一个IOC容器对象调用getBean()方法通过id(bookService)对bean标签进行加载,即可得到bookService对象,在配置文件中,id="bookService"的标签通过全类名定位该实体类,最后调用其方法。

weixin_65440201的博客 1455

二、Spring Framework基础:IoC(控制反转)和DI(依赖注入)

IoC(Inversion of Control,控制反转)是一种设计思想,用于降低代码之间的耦合度。将对象的创建和管理交给框架,而不是由程序员手动创建和管理。在传统的编程中,对象的创建和依赖关系是由程序员手动管理的。// 客户端直接创建服务对象在这个例子中,Client类直接依赖于Service类,这种依赖关系是硬编码的,耦合度很高。如果Service类的实现发生变化,Client类也需要修改。// 服务对象由外部注入在这种模式下,Client类不再直接创建Service。

xiaoqi270620903的专栏 1266

Spring Framework 入门第一天:掌握核心容器 IOC 与 DI

本文介绍了Spring Framework的核心概念IOC(控制反转)和DI(依赖注入)。IOC将对象创建权交给容器管理,解决代码耦合问题;DI则负责建立Bean间的依赖关系。文章通过创建Maven项目、配置XML文件和获取容器对象等步骤,演示了如何实现IOC容器管理对象。最后指出需要通过DI彻底消除代码中的new操作,实现完全解耦。Spring Framework作为Spring家族的基础,其核心容器是后续学习Spring Boot和Spring Cloud的重要基础。

auspicious349的博客 428

不看后悔之Spring Framework探秘:深度解读IoC与DI的核心奥秘

随着Spring Boot和Spring Cloud的发展,IoC与DI的理念得到了进一步的强化和简化。Spring Boot自动配置功能极大地减少了手动配置Bean的工作量,它会根据项目中引入的依赖自动装配相关的Bean。同时,Spring Cloud在微服务架构下延续了IoC和DI的优势,利用服务发现、配置中心等功能组件,让各个服务之间的依赖关系更加透明且易于管理。

qq_58366795的博客 929

[Spring Framework]核心概念(IOC/DI、IOC容器和Bean)、IOC初次使用

业务层需要调用数据层的方法,就需要在业务层new数据层的对象。如果数据层的实现类发生变化,那么业务层的代码也需要跟着改变,发生变更后,都需要进行编译打包和重部署: 所以,现在代码在编写的过程中存在的问题是:耦合度偏高针对这个问题,该如何解决呢? 我们就想,如果能把框中的内容给去掉,不就可以降低依赖了么,但是又会引入新的问题,去掉以后程序能运行么?答案肯定是不行,因为bookDao没有赋值为Null,强行运行就会出空指针异常。所以现在的问题就是,业务层不想new对象,运行的时候又需要这个对象,该咋办呢?针

十八岁讨厌编程的博客 825

【Spring】Spring简介、IOC、DI

IOC:Inversion of Control,翻译过来是反转控制。反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源 的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。 DI:Dependency Injection,翻译过来是依赖注入。 DI 是 IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容

Demo的博客 1143

Spring IoC与DI核心原理及实践指南

控制反转(IoC)和依赖注入(DI)是现代Java开发的核心设计模式,通过将对象创建和依赖管理的控制权交给容器,实现了组件间的松耦合。Spring框架作为Java生态中最流行的IoC容器,提供了完整的DI实现方案。从技术原理看,IoC容器通过Bean生命周期管理、依赖解析和自动装配等机制,大幅提升了代码的可测试性和可维护性。在实际工程中,Spring支持构造器注入、Setter注入等多种DI方式,并结合XML、注解和Java配置等元数据形式,满足不同场景需求。特别是在微服务架构下,Spring IoC与云原

weixin_34023982的博客 376

Spring Framework(超详细)

Bean相关依赖相关。

2301_80744893的博客 2176

【Spring】控制反转(Ioc)、依赖注入(DI)

Spring 控制反转、依赖注入

triticale的博客 1269
上一篇: Spring Framework(2)-Spring与开发模式演进
下一篇: Spring Framework(4)-AOP总结
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

BoringRong

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

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

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

打赏作者

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

抵扣说明:

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

余额充值