Spring的控制翻转(IOC)与依赖注入(DI)

news2024/11/23 7:08:41

SpringIOC

即 Inversion of Control,缩写为 IOC,就是由 Spring IoC 容器管理对象,而非传统实现中由程序代码直接操控.

  • 使用IOC容器管理bean(IOC)

  • 在IOC容器中将有依赖关系的bean进行关系绑定

最终达到的目的:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean一旦有依赖关系,也是已经绑定了的。

为什么要使用IOC?

因为我们之前写的代码,耦合度是偏高的,例如我们的一个项目中,对类进行了改变,那么调用它创建这个对象的地方也需要改变,这就导致了一系列问题,重新测试、重新部署、重新编译、重新发布,这些都是有成本的。所以我们就追求一种低耦合高内聚的方式。

解决方式::使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象;

从 BookDao bd = new BookDao();

转为 BookDao bd ;

这种思想就称为IOC(Inversion of Control),控制反转,意思就是创建对象这件事代码不要做了,对象的控制权由程序转移到外部,这种思想称为控制反转

IOC与DI的最终目的?

IOC与DI的主要目的只有一个:充分解耦

spring如何实现IOC和DI思想?

  • spring提供了一个容器,称为IOC容器,用来充当IOC思想的“外部”,这个容器就是Core Container;

  • IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为Bean

  • 当类中还使用了其他类时,容器中建立bean与bean之间的依赖关系的整个过程,称为DI(Dependence Injection)依赖注入。

    多个关联使用的bean,IOC容器直接给你绑定好,绑定的这个过程,叫做依赖注入。

一些常见问题:

IOC管理的是什么?(Service和Dao)

如何将被管理的对象告知IOC容器? (通过配置)

被管理的对象交给IOC容器,如何获取到IOC容器?(通过接口)

IOC容器得到后,如何从容器中获取bean?(接口方法)

使用spring导入哪些坐标?pom.xml

 spring具体如何实现IOC和DI?

总体来说分为两种方式:XML配置文件  和  注解实现

1.基于XML管理

我们在spring.xml中对bean进行管理,在beans中我们对每一个需要使用的对象进行管理配置

(1)bean是什么?

bean指的是spring管理的对象,与我们自己new的对象不一样,spring可以对其添加额外功能。

bean中的属性介绍:

  1. id: 生成的对象名class 全类名

  2. name: 对象别名,可以为多个,用空格或“,”或”;“隔开即可,但是我们还是建议使用id

  3. scope: 定义创建的bean有几个

  • singleton(默认值):在 Spring 中只存在一个 bean 实例, 单例模式.

    为什么要默认单例?

    因为spring帮我们管理的对象例如dao和service都是可以复用的,我们并不需要每次都创建一个新的

    哪些是适合交给容器进行管理的bean?

    造一次就可以反复用的:

    表现层对象

    业务层对象

    数据层对象

    工具对象

    那些是不适合交给容器管理的bean?

    封装实体的域对象

  • prototype:原型getBean()的时候都会 new Bean()

  • request:每次 http请求都会创建一个 bean, 仅用于 WebApplicationContext环境

  • session:同一个 httpsession 共享一个 Bean, 不同 Session 使用不同的 Bean, 使用环境同上

    创建对象时注入数据的方式:

    set 方法注入 :在set方法中进行注入

    构造方法注入:在bean中进行注入

        <bean id="admin" class="com.ffyc.spring.model.Admin">
            <property name="account" value="1"></property>
            <property name="id" value="2"></property>
        </bean>

property是为这个bean对象的属性赋值或者是依赖注入,name表示具体的哪个属性,ref表示参照对应哪个bean(依赖注入),value设置默认值(基本类型时)

(2)我们在xml文件中配置完bean后,要怎么使用呢?

 编写一个类,通过刚才的配置文件获取IOC容器,然后通过容器获取对象即可。

(3)bean是如何创建出来的?

实例化bean的三种方式:

1.提供可访问的构造方法

其实就是在类中提供无参构造即可

bean本质上还是对象,spring创建bean也是使用无参构造方法创建

我们把构造方法私有化以后,容器还是可以调用构造方法创建对象,要知道我们以前new对象的时候,private的构造方法是肯定不行的,那么spring是通过什么调用的呢?答案就是反射机制

2.使用静态工厂实例化bean

首先需要创建一个工厂用来生产bean,然后在配置文件中将工厂配置进去,让spring来管理工厂

(注:早期经常通过工厂方式解耦)

3.实例工厂初始化bean
4.spring特意对方式3进行了优化,有标准的实现

(4)bean的生命周期?

生命周期:从创建到消亡的完整过程

bean生命周期:bean从创建到销毁的整个过程

  • 初始化容器

    1. 创建对象(内存分配)

    2. 执行构造方法

    3. 执行属性注入(set操作)

    4. 执行bean初始化方法

  • 使用bean

    执行业务操作

  • 关闭/销毁容器

    执行bean销毁方法

(5)bean生命周期控制

生命周期控制就是在bean创建后到销毁前做一些事情 。

(6)依赖注入(DI)的实现(手动实现)

DI就是当类中还使用了其他类时,容器中建立bean与bean之间的依赖关系的整个过程,称为DI(Dependence Injection)依赖注入。(其实就是为这个类赋初值)

1.setter方法注入

先写set方法:

然后进行配置:

 2.构造器注入

先写构造方法:

 然后进行配置:

 

注入方式的选择:

 总之:自己写建议使用setter,第三方技术视情况而定,构造器注入是比较严谨的

(7)第三方bean管理

上面我们管理的bean都是我们自己创建的类,那么如果要管理外部的第三方类,就是从maven中导入的类时,应该怎么操作呢?

其实也是对bean进行配置,将管理权交给IOC容器管理,然后进行依赖注入(赋初值)即可。

例如与数据库连接的对象:

前提是先导入maven包,然后在配置文件中进行配置

 以上就是我们使用xml配置应该注意的问题~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C】回调函数和qsort详解

回调函数概念 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一 个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;我们就说这是回调函数。回调函数不是由该 函数的实现方直接调用&#xff0c;…

七大排序算法——快速排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、快速排序核心思想Hoare法挖坑法前后指针法(选学) 三、性能分析四、算法优化优化基准的选取优化少量数据时的排序方案优化后的完整代码 五、七大排序算法 一、排序的概念 排序的概念 排序&#xff1a;所谓排序…

基于ChatGPT和私有知识库搭建Quivr项目

准备工作 安装docker和docker-compose申请supabase账号 拉取Quivr代码 git clone https://github.com/StanGirard/Quivr.git 复制.XXXXX_env文件 cp .backend_env.example backend/.env cp .frontend_env.example frontend/.env 更新backend/.env和frontend/.env文件 ba…

靶场的安装

sqli-lab 1.将安装包解压放到WWW目录下 2.修改 db-creds.inc文件里面的数据库的用户名密码为自己的用户名密码 路径&#xff1a;D:\phpStudy_64\phpstudy_pro\WWW\sqli-labs-master\sql-connections\db-creds.inc 3. 更改php版本位5.9版本&#xff0c;不然会报错 4.安装数…

【采用有限元法技术计算固有频率和欧拉屈曲荷载】使用有限元法的柱子的固有频率和屈曲荷载(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Android JNI 异常处理 (十一)

🔥 Android Studio 版本 🔥 🔥 创建包含JNI的类 JNIException.java 🔥 package com.cmake.ndk1.jni;public class JNIException {static {System.loadLibrary("exception-lib");}public native void nativeInvokeJavaException();public native void nativ…

B站这些“搬运工”还能有这么高的流量吗?

飞瓜数据&#xff08;B站版&#xff09;观察发现&#xff0c;B站经常有一些搬运视频能够获得超高流量。 比如拉取近15天的B站热门视频&#xff0c;位列前排的就有两个是搬运二创视频&#xff0c;播放量高达900万上下&#xff0c;可以说是爆款视频了。 这些视频有一个相同的点就…

Qt Https通信: TLS initialization failed 解决方法

Qt Https通信&#xff1a; TLS initialization failed 解决方法&#xff0c;Window端使用Qt 做开发请求Https资源时&#xff0c;会经常遇到 TLS initialization failed。 原因分析&#xff1a; 在Qt中并未包含 SSL所包含的库&#xff0c;因此需要开发者&#xff0c;自己将库拷贝…

最新华为鸿蒙4.0安装谷歌服务框架,安装Play商店,谷歌Google,GMS

最近华为推出了最新鸿蒙4.0开发者Beta版本&#xff0c;让用户测试体验。那么测试体验的机器主要是最近发布的几款机器为P60,P60 Pro, mate50,mate50 pro等几款产品可以先期进行体验测试鸿蒙4.0&#xff0c;那么很多的用户在疑问我升级到鸿蒙4.0。是不是还是可以使用Google谷歌服…

LINUX环境小实验

实验报告 实验名称 小环境搭设 实验目的 1.搭建DHCP服务器&#xff08;IP&#xff1a;192.168.100.253静态IP网卡vmnet1&#xff09; 2.搭建DNS&#xff08;通过DHCP服务器分到指定的IP&#xff1a;192.168.100.252&#xff09; 3.搭建网站服务&#xff08;通过DHCP服务器分…

波分复用(WDM)基本原理

文章目录 波分复用WDMDWDM解决问题&#xff0c;特点&#xff0d;超长距离无电中继传输&#xff0c;降低成本 波分系统的基本组成DWDM网元基本类型波分常见站点类型OM/OD技术&#xff0d;波分复用器主要参数 DWDM系统关键技术光转发技术 OM/OD技术&#xff0d;波分复用器件 波分…

Bun 0.6.14发布,1.0版预计发布于9月7日

Bun 是一个 JavaScript 运行时。 Bun 是一个从头开始构建的新 JavaScript 运行时&#xff0c;旨在服务现代 JavaScript 生态系统。它有三个主要设计目标&#xff1a; 速度。包子启动快&#xff0c;运行也快。它扩展了 JavaScriptCore&#xff0c;即为 Safari 构建的注重性能的 …

Office如何通过VSTO进行PPT插件开发?

文章目录 0.引言1.工具准备2.PPT外接程序创建和生成3.外接程序生成并使用 0.引言 VSTO&#xff08;Visual Studio Tools for Office &#xff09;是VBA的替代&#xff0c;是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展O…

EIK+Filebeat+Kafka

目录 Kafka 概述 为什么需要消息队列&#xff08;MQ&#xff09; 使用消息队列的好处 消息队列的两种模式 Kafka 定义 Kafka 简介 Kafka 的特性 Kafka 系统架构 Partation 数据路由规则&#xff1a; 分区的原因 部署 kafka 集群 1.下载安装包 2.安装 Kafka 修改配…

【979. 在二叉树中分配硬币】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定一个有 N 个结点的二叉树的根结点 root&#xff0c;树中的每个结点上都对应有 node.val 枚硬币&#xff0c;并且总共有 N 枚硬币。 在一次移动中&#xff0c;我们可以选择两个相邻的结点&#x…

【C++】list简单介绍

list基本功能介绍 前言正式开始构造函数push_backiteratorpush_frontinserterasespliceremoveuniquereversesortmerge 前言 本篇不会讲太多细节&#xff0c;就说一下STL库中一些函数的基本用法&#xff0c;如果想要了解细节上的东西的话&#xff0c;建议看我string的介绍&…

QT ui_xxx.h: no such file or directory”

使用QT新建子窗口后,编译无法通过 mainwindow.obj:-1: error: LNK2019: 无法解析的外部符号 "public: __cdecl labelwindow::labelwindow(class QWidget *)" (??0labelwindowQEAAPEAVQWidgetZ)&#xff0c;该符号在函数 "private: void __cdecl MainWindow::o…

android studio 添加并读取json配置文件

第一步&#xff1a;在android studio中添加json文件&#xff1b; 第二步&#xff1a;读取文件的函数 private String[] getJosnData(){String result[] null;List<String> list new ArrayList<>();try {//获取本地的Json文件AssetManager assetManager mConte…

界面控件DevExtreme v23.1新版亮点 - 全新的DateRangeBox组件

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

【Qt】 自定义列表控件

一、效果图 二、思路 先实现单个item控件&#xff0c;之后根据所需个数new出来插入布局中。item过多时支持滑动操作&#xff0c;可以把item放入scrollArea中&#xff0c;如需实现滑动效果可以使用eventFilter&#xff0c;计算坐标配合scrollArea->verticalScrollBar()->…