我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解SpringIOC容器相关知识

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解SpringIOC容器相关知识

一、前言

IOC控制反转,不是一种技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交给Spring框架来管理。

区别:

  • 没有IOC的思路:若要使用某个对象,就必须自己负责去写对象的创建
  • IOC的思路:若要使用某个对象,只需要从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权交给了Spring框架。
  • 好莱坞法则:Don't call me, I 'll call you

举例说明:

做菜,做蒜薹炒猪肉

你有两种做法:

第一种,自己养猪,然后种蒜薹。等到猪长大了,你就可以杀猪,蒜薹成熟了,就收割。然后开始炒,做成了蒜薹炒猪肉。

第二种,从农贸市场获取猪和蒜薹,拿回来直接炒,做成了蒜薹炒猪肉。

此时的IOC就相当于这个农贸市场,我要做菜,我去农贸市场拿过来就可以了,而不需要自己去弄。为什么要Java对象放到容器里?因为我们要做到拿来即用,便于管理。那你能管理农贸市场吗?你不能,那谁来管农贸市场?Spring!这就是控制反转IOC,我们把控制权交给了Spring框架,他来帮我们管这个农贸市场,他来养猪,他来种菜。我们只需在要菜的时候,去市场买就好了。

再举一个例子

过年了,想要给家里打扫个卫生,你想请几个钟点工来打扫。也有两种做法。

第一种:自己主动找,找身边人看看谁认识钟点工,你自己打电话邀约,谈价格

第二种:直接找家政公司,直接提出需求即可。

第一种方式就是我们自己创建对象的方式,自己主动new几个钟点工。而第二种就是spring给我们提供的IOC方式,家政公司就是一个容器,能给我提供很多的服务,钟点工对象是spring帮我们创建的。

又过了几天,我又想给厨房的油烟机清理一下,也能直接打电话给家政公司,提出需求。

那上述例子中的农贸市场和家政公司哪里来啊?

我们可以自己构建,就像自己成立一个公司一样。具体在程序中表现为:

1.使用配置文件或者注解的方式定义一下我们自己容器里存放的东西。

或者去别人的公司里找。具体在程序中表现为:

2.一定有很多人创建了自己的公司,这些服务都可以集成在我们自己的容器里,为我们提供强大的功能,比如spring自带很多的template模板类。

二、IOC原理实战

首先在pom.xml文件中加入spring的相关jar包。


<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>
</dependencies>

我们定义我们的接口和实现类


// UserDao接口
public interface UserDao {
    void getUser();
}
// UserDao实现类1,mysql实现
public class UserDaoImpl implements UserDao {
    public void getUser() {
        System.out.println("mysql实现");
    }
}
// UserDao实现类2,oracle实现
public class UserDaoImpl implements UserDao {
    public void getUser() {
        System.out.println("oracle实现");
    }
}

然后我们的业务实现类,在不使用set注入的情况下,是这样的:


//业务接口
public interface UserService {
    void getUser();
}
//业务实现类
public class UserServiceImpl implements UserService {
    //传统的方法中,如果这边要改变,那就必须将这里的语句改变才可以
    private UserDao userDao = new UserDaoImpl();

    public void getUser() {
        userDao.getUser();
    }
}

对应的测试类:


public class MyTest {
    public static void main(String[] args) {
        //用户实际调用的是业务层,不需要接触dao层
        UserServiceImpl userService =new UserServiceImpl();
        userService.getUser();
    }
}

但是你会发现使用这种方法如果我在测试这里想用oracle实现,那就必须新增一个业务实现类或者修改我原本的业务实现类,违反了开闭原则。

所以我们的业务实现类要使用set方法动态注入我们的UserDao实现类。


public class UserServiceImpl implements UserService {
    private UserDao userDao;
    // 利用set进行动态实现值的注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void getUser() {
        userDao.getUser();
    }
}

如此一来只需要在测试类中通过set方法,传入对应的实现类对象,就可以实现调用不同的实现对象的getUser方法。


public class MyTest {
    public static void main(String[] args) {
        // 利用set注入的方法,我们可以不需要修改service中的代码,从而实现多个不同对象的getUser方法
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(new UserDaoImpl());
        userService.getUser();//mysql实现
        userService.setUserDao(new UserDaoOracleImpl());
        userService.getUser();//oracle实现
    }
}

这两种模式的区别可以发现。之前,控制UserDao实现类的控制权,在程序员手上,程序员写在UserServiceImpl里,写死了对应的是实现类,如果要修改的话,程序员就必须去修改对应的代码。而后面这种方法,控制UserDao实现类的控制权,就已经不在程序员手上了。现在程序是被动接收对象,然后动态set注入实现了可以随意使用不同的实现类的getUser方法。

这其实就是一种控制反转IOC的原型。这种思想从本质上解决了问题,程序员不用再去管理对象的创建了。系统的耦合性大大降低。可以更加专注的在业务的实现上。spring的底层全部都是基于这种思想去实现的。

三、IOC本质

在这里插入图片描述

像上图所示,IOC本质上就是把左边变成了右边。本来是业务层里程序员写来主动决定调用的下面的Mysql还是Oracle,但是现在通过IOC,可以把主动权交给用户,让用户想用Mysql用Mysql,想用Oracle就用Oracle。

DI(依赖注入)是实现IOC的一种方法,在没有IOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码再程序中,对象的创建由程序自己控制(也就是程序员自己写),控制反转(IOC)后将对象的创建移交给第三方了,控制反转的这个反转说的就是获得依赖对象的方式反转了。

采用XML配置方式配置Bean的时候,Bean的定义信息和实现是分离的,而采用注解的方式的时候两者是合为一体的,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目睹。

控制反转是一种通过描述(XML或者注解)并通过第三方去生产或获得特定对象的方式。在Spring中实现控制反转的是IOC容器,其实现方式是依赖注入(Dependency Injection,DI)

四、spring helloworld

找到1.2.2实例化容器部分,发现了其配置文件格式:

在这里插入图片描述

首先创建我们的实体类Hello:


package com.hj.pojo;
public class Hello {
    private String str;

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
}

然后根据文档中所述,在resources文件下创建beans.xml文件来使用spring创建对象。beans.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来创建对象,在spring中这些都称为bean
    bean = 对象 相当于 new Hello();
    正常是 类型 变量名 = new 类型();
          Hello hello = new Hello();
    利用bean来实现,id就是变量名,class就是我们对象的类型
    里面的property相当于给对象中的属性设置一个值。
    -->
    <bean id="hello" class="com.hj.pojo.Hello">
        <!--
        ref:引用spring容器中创建好的对象
        value:具体的值,基本数据类型
        -->
        <property name="str" value="Spring"/>
    </bean>

</beans>

再次查看官方文档,查询如何使用容器。

在这里插入图片描述

可以看到需要借助一个工厂来读取bean的定义并进行访问,然后创建对象。


import com.hj.pojo.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {    
	public static void main(String[] args) {        
		//获取spring的上下文对象        
		ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");        
		//我们的对象现在都在spring中管理了,我们要使用,直接去取出来就可以了        
		Hello hello = (Hello) context.getBean("hello");        
		System.out.println(hello.toString());//Hello{str='Spring'}        
		//思考?        
		//Hello对象是谁创建的?是由Spring创建的        
		//Hello对象的属性是怎么设置的?是由Spring容器设置的    
		}
	}

这个Hello对象由spring创建并且由spring容器设置属性的过程就是控制反转。

五、小结

控制:谁来控制对象的创建,传统的应用程序的对象是由程序本身控制创建的,使用spring后,对象是由spring来创建的。

反转:程序本身不创建对象,而变成被动的接收对象

依赖注入:就是利用set方法来进行注入

IOC是一种编程思想,由主动的编程去变成被动的接收。

我们回头看Hello类里左边有个豆子的标志了,这说明这个类已经被Spring托管了。

在这里插入图片描述

所谓的IoC,一句话来概括:对象由spring来创建,管理和装配。

到此这篇关于详解SpringIOC和容器相关知识的文章就介绍到这了,更多相关SpringIOC和容器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解SpringIOC容器相关知识

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

云服务器相关知识有哪些内容

云服务器是一种虚拟的数据中心基础设施,它允许用户将数据存储在云中,并由多种服务提供商使用。以下是云服务器相关知识的主要内容:网络基础设施:云服务器需要一个稳定的网络连接以支持多种应用程序和数据。这可能涉及到通过互联网连接到公共云服务提供商来访问网络。存储基础设施:云服务器通常会部署多种存储服务,如云存储、本地存储和网络存储。存储服务供应商通常会提供多种存储选项、容量和安全性级别。安全管理
2023-10-26

云服务器相关知识

云服务器(CloudServer)是一种基于互联网的服务器,它可以让用户远程访问并管理互联网上的资源,如图片、视频、文档、音频和3D图形等。云服务器提供了一种高性能、高可扩展性和弹性的资源访问方式。云服务器通常使用虚拟化技术将多个计算机虚拟成一个集群,从而实现对服务器资源的远程访问。它通过网络协议连接到互联网上的多个计算机,并通过软件来管理这些服务器。在云服务器上,用户可以使用各种操作系统和应
2023-10-26

R语言中循环的相关知识详解

这篇文章主要为大家详细介绍了R语言中循环的相关知识,文中的示例代码讲解详细,对我们学习R语言有一定的帮助,感兴趣的可以了解一下
2023-03-19

云服务器相关知识点有哪些内容

IaaS(基础设施即服务):云服务器提供商提供的是IaaS层的服务,包括云主机、负载均衡、弹性计算、存储等。IaaS服务商提供的主要功能是为用户提供基础设施服务,使用户可以根据自己的需求购买云服务器的硬件资源,并按需付费使用。PaaS(平台即服务):云服务器提供商提供的是PaaS层的服务,包括应用开发平台、运行时环境、数据库等。PaaS服务商提供的主要功能是为用户提供应用开发、运行和管理的平台,用户可以通过云服务...
2023-10-27

云服务器相关知识有哪些内容呢

云服务器的概念和特点云服务器是一种虚拟化技术,它将多个计算资源(如服务器、存储、网络等)通过网络连接在一起,形成一个统一的计算平台。云服务器具有以下特点:(1)可扩展性:用户可以根据需要随时添加、减少或删除计算资源。(2)可靠性:云服务器采用分布式架构,具有高可用性和冗余性。(3)高可用性:云服务器可以提供备份和恢复机
2023-10-27

解读Vue-loader的相关知识

这篇文章主要介绍了解读Vue-loader的相关知识,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-24

python装饰器相关知识点

小编给大家分享一下python装饰器相关知识点,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、装饰器1.相关知识点*args:负责将多余的位置实参汇总,赋值给a
2023-06-29

云服务器相关知识点

云服务器是一种虚拟的数据中心基础设施,它允许用户将数据存储在云中,并使用公有云提供商的资源进行处理。以下是一些有关云服务器的相关知识点:云服务器的类型:包括公有云、私有云和混合云。公有云通常由第三方提供商提供,而私有云通常由企业自行管理。虚拟化:虚拟化是将物理资源转换为虚拟资源的过程。云服务器通常使用虚拟化技术来提高云计算的效率和可靠性。云存储:云存储是一种将数据分散存储在多个云服务器上
2023-10-26

云服务器相关知识有哪些内容和方法

云服务器的基础知识:了解云服务器的概念、优势、功能和应用场景。云服务器的架构:了解云服务器的架构类型、服务器硬件、软件系统等方面的内容。云服务器的配置和管理:了解云服务器的配置参数、管理工具和配置技巧。云服务器的安全:了解云服务器的安全要求、安全策略和常见攻击。云服务器的优化:了解云服务器的优化技巧和策略,例如负载均衡、高可用性等。云服务器的故障和恢复:了解云服务器的故障处理和恢复方法,包括备份、...
2023-10-27

云服务器相关知识有哪些内容和要求

以下是云服务器的一些相关知识和要求:安全性:云服务器需要提供安全的服务,包括数据加密、访问控制、防火墙、身份验证等措施,以保障用户数据的安全性。可用性:云服务器需要支持多种运行模式,包括基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS),以便用户根据实际需求进行选择。可靠性:云服务器需要具备高可靠性,包括备份和容灾、冗余和负载均衡等措施,以确保数据的安全性和服务的稳定性。可扩展性:云服...
2023-10-27

Postgresql 触发器实例及相关知识了解

执行顺序 1)触发器按按执行的时间被分为before触发器和after触发器。语句级的before触发器在语句开始执行前被调用,语句级的after触发器在语句开始执行结束后被调用。 2)数据行级的before触发器在操作每个数据行以前被调用,数据行级的afte
Postgresql 触发器实例及相关知识了解
2020-02-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录