当前位置: 首页 > news >正文

Spring IoC和DI详解

IOC思想

IoC( Inversion of Control,控制反转) 不是一门具体技术,而是一种设计思想, 是一种软件设计原则,它将应用程序的控制权(Bean的创建和依赖关系)从应用程序代码中解耦出来通过外部容器来管理和协调对象的创建、依赖注入和生命周期管理,这种反转控制的方式使得应用程序更加灵活、可扩展和易于维护。

了解DI

Spring DI(Dependency Injection,依赖注入)是Spring框架中的一个重要特性,它实现了控制反转(IoC)的核心原则(IOC 是一种控制反转的思想, 而 DI 是对IoC的一种具体实现 ),它将对象的依赖关系由容器负责管理和注入,而不是由对象自身负责创建和管理依赖。

DI的三种实现方式

 构造函数注入(Constructor Injection):通过在类的构造函数中声明依赖参数,容器在创建对象时自动将相应的依赖注入。

属性注入(Setter Injection):通过在类中定义相应的属性,并提供相应的setter方法,容器在创建对象后,通过调用setter方法将依赖注入到对象中。

接口注入(Interface Injection):通过在类中定义接口,并在接口中定义注入方法,容器在创建对象后,通过调用接口方法将依赖注入到对象中。

DI的作用和优势

1. 降低耦合度:DI通过将对象之间的依赖关系从代码中移除,实现了对象之间的解耦。对象不再直接创建和管理依赖,而是通过外部的容器来注入依赖。这样,当需要修改或替换依赖时,只需调整容器的配置,而不需要修改对象的代码。

2. 促进代码复用:DI鼓励使用接口和抽象类来定义对象之间的依赖关系,而不是具体的实现类。这样可以提高代码的灵活性和可复用性。通过注入不同的实现类,可以轻松地更换对象的行为,实现不同的业务逻辑。

3. 简化代码的维护和扩展:当需要修改或扩展功能时,只需修改容器的配置,而不需要修改对象的代码,避免了代码的膨胀和重复,提高了代码的可维护性和可扩展性。

Spring IoC容器

Spring IoC容器是 IoC思想的具体组件实现 ,是一个负责创建和管理对象的容器。IoC容器中管理的组件叫做 bean对象 ,它通过读取配置信息或注解来了解对象之间的依赖关系,并在需要时实例化和注入这些对象。spring在创建 bean 之前,首先需要创建IoC 容器。

IoC容器的两种实现方式

1. BeanFactory

BeanFactory是Spring内部使用的接口,用于实现IOC容器的基本功能,它主要面向Spring框架本身的实现和扩展,而不是直接提供给开发人员使用。

2. ApplicationContext

ApplicationContext是BeanFactory 的子接口,提供了更多高级特性(如国际化、事件发布、资源加载等),面向 Spring 的使用者,几乎所有场合都使用 ApplicationContext 而不是底层的 BeanFactory。

主要实现类(创建容器)介绍:

ConfigurableApplicationContext: 是ApplicationContext接口的子接口,它扩展了功能,比如refresh() 和 close() 方法,让 ApplicationContext 具有启动、关闭和刷新上下文的能力。

ClassPathXmlApplicationContext: 通过从类路径中加载XML配置文件来创建和初始化容器的实现类。它是最常用的配置方式之一,可以通过在类路径中指定的XML文件来定义Bean和它们之间的依赖关系。

//简单创建
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

FileSystemXmlApplicationContext:通过从文件系统中加载XML配置文件来创建和初始化容器的实现类。它适用于在文件系统中指定XML文件的场景,可以通过指定文件路径来定义Bean和它们之间的依赖关系。

ApplicationContext context = new FileSystemXmlApplicationContext("path/applicationContext.xml");

AnnotationConfigApplicationContext: 通过扫描指定的包路径,自动注册和初始化Bean的实现类,它是基于注解的配置方式,通过在Bean类上使用注解来标识Bean的作用域、依赖关系等信息,而无需使用XML配置文件。

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

XmlWebApplicationContext:用于Web应用程序的实现类,它可以加载并解析位于Web应用程序的Web根目录下的XML配置文件,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。

XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocation("/WEB-INF/applicationContext.xml");

相关文章:

Spring IoC和DI详解

IOC思想 IoC( Inversion of Control,控制反转) 不是一门具体技术,而是一种设计思想, 是一种软件设计原则,它将应用程序的控制权(Bean的创建和依赖关系)从应用程序代码中解耦出来&am…...

mysql-binlog

1. 常用的binlog日志操作命令 1. 查看bin-log是否开启 show variables like log_%;2. 查看所有binlog日志列表 show master logs;3.查看master状态 show master status;4. 重置(清空)所有binlog日志 reset master;2. 查看binlog日志内容 1、使用mysqlb…...

通过BeanFactotyPostProcessor动态修改@FeignClient的path

最近项目有个需求,要在启动后,动态修改FeignClient的请求路径,网上找到的基本都是在FeignClient里使用${…},通过配置文件来定义Feign的接口路径,这并不能满足我们的需求 由于某些特殊原因,我们的每个接口…...

数据结构与算法系列-二分查找

二分查找 什么是二分查找&#xff1f; 二分查找是一种针对有序集合&#xff0c;每次将要查找的区间缩小一半&#xff0c;直到找到查找元素&#xff0c;或区间被缩小为0。 如何实现二分查找&#xff1f; 实现有3个注意点&#xff1a; 终止条件是 low < high 2.求中点的算…...

CSS 毛玻璃特效运用目录

主要是记录毛玻璃相关的特效实践案例和实现思路。 章节名称完成度难度文章地址完整代码下载地址Glassmorphism 登录表单完成一般文章链接代码下载Glassmorphism 按钮悬停效果完成一般文章链接代码下载Glassmorphism 计算器完成一般文章链接代码下载Glassmorphism 卡片悬停效果…...

如何在Qt6中引入Network模块

2023年10月1日&#xff0c;周日凌晨 2023年10月2日&#xff0c;周一下午 第一次更新 目录 如果用的是CMakeQt Console ApplicationQt Widgets Application如果用的是qmake 如果用的是CMake find_package(Qt6 COMPONENTS Network REQUIRED) target_link_libraries(mytarget…...

2023/10/4 QT实现TCP服务器客户端搭建

服务器端&#xff1a; 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { cla…...

云原生边缘计算KubeEdge安装配置

1. K8S集群部署&#xff0c;可以参考如下博客 请安装k8s集群&#xff0c;centos安装k8s集群 请安装k8s集群&#xff0c;ubuntu安装k8s集群 2.安装kubEedge 2.1 编辑kube-proxy使用ipvs代理 kubectl edit configmaps kube-proxy -n kube-system #修改kube-proxy#大约在40多行…...

【LeetCode热题100】--35.搜索插入位置

35.搜索插入位置 使用二分查找&#xff1a; class Solution {public int searchInsert(int[] nums, int target) {int low 0,high nums.length -1;while(low < high){//注意每次循环完都要计算midint mid (low high)/2;if(nums[mid] target){return mid;}if(nums[mid]…...

mysql面试题13:MySQL中什么是异步复制?底层实现?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲mysql中什么是异步复制?底层实现? MySQL中的异步复制(Asynchronous Replication)是一种复制模式,主服务器将数据写入二进制日志后,无…...

SpringBoot-Shiro安全权限框架

Apache Shiro是一个强大而灵活的开源安全框架&#xff0c;它干净利落地处理身份认证&#xff0c;授权&#xff0c;企业会话管理和加密。 官网&#xff1a; http://shiro.apache.org/ 源码&#xff1a; https://github.com/apache/shiro Subject&#xff1a;代表当前用户或…...

PostgreSQL基础语法

当谈到关系型数据库管理系统&#xff08;RDBMS&#xff09;时&#xff0c;PostgreSQL是一个备受推崇的选择。它是一个开源的、强大的RDBMS&#xff0c;具有广泛的功能和支持。本文将介绍一些PostgreSQL的基础语法&#xff0c;以帮助您入门。 1. 安装和配置 在开始使用PostgreS…...

编程前置:处理Excel表格,定位单元格位置,输入文字前,让AI机器人知道我说什么

原提问&#xff1a; input输入表头 &#xff08;input内除了/&#xff0c;空格 回车 标点符号等 全部作为单元格分隔符&#xff09; 由我设置input输入的是行or列 给选项 1. 行 2. 列 默认回车或没输入值是列由我设置起始位置行列 例如 3,2 表示3行2列 当我输入3,2 就表示在第…...

Linux基本指令介绍系列第四篇

文章目录 前言一、Linux基本指令介绍1、more指令2、less指令3、head指令4、tail指令5、bc指令6、管道文件介绍7、与时间相关的指令 总结 前言 本文介绍Linux使用时的部分指令&#xff0c;读者如果想了解更多基本指令的使用&#xff0c;可以关注博主的后续的文章。 博主使用的实…...

读取vivo手机截图尺寸移动.jpg等文件

这个代码的设计初衷是为了解决图片处理过程中的一些痛点。想象一下&#xff0c;我们都曾遇到过这样的情况&#xff1a;相机拍摄出来的照片、网络下载的图片&#xff0c;尺寸五花八门&#xff0c;大小不一。而我们又渴望将它们整理成一套拥有统一尺寸的图片&#xff0c;让它们更…...

Web前端-Vue2+Vue3基础入门到实战项目-Day2(指令补充, computed计算属性, watch侦听器, 水果购物车)

Web前端-Vue2Vue3基础入门到实战项目-Day2 指令补充指令修饰符v-bind 对样式控制的增强控制class案例 - 京东秒杀tab导航高亮控制style案例 - 控制进度条 v-model 应用于其他表单元素 computed计算属性基本使用computed计算属性 vs methods方法计算属性完整写法案例 - 成绩 wat…...

ffmpeg之去除视频水印

ffmpeg去除水印使用delogo视频滤镜。 delogo参数: x,y,w,h分别表示logo区域的左上角位置及宽度和高度&#xff1b; show:0表示不显示logo区域&#xff0c;1表示显示logo区域。 执行下面的命令&#xff1a; ffmpeg -i 1.mp4 -vf delogox300:y10:w80:h30:show0 out.mp4 效果…...

第二章 线性表

线性表 线性表的基本概念线性表的顺序存储线性表顺序存储的类型定义线性表基本运算在顺序表上的实现顺序表实现算法的分析 线性表的链接存储单链表的类型定义线性表的基本运算在单链表上的实现 其他运算在单链表上的实现建表删除重复结点 其他链表循环链表双向循环链表 顺序实现…...

Java 超高频常见字符操作【建议收藏】

文章目录 前言1. 字符串拼接2. 字符串查找3. 字符串截取4. 字符串替換5. 字符串分割6. 字符串比较7. 字符串格式化8. 字符串空格处理 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一…...

MongoDB数据库网站网页实例-编程语言Python+Django

程序示例精选 PythonDjangoMongoDB数据库网站网页实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoMongoDB数据库网站网页实例》编写代码&#xff0c;代码整洁&#xff0c;…...

开箱报告,Simulink Toolbox库模块使用指南(七)——S-Fuction Builter模块

S-Fuction Builter S-Fuction Builter模块&#xff0c;Mathworks官方Help对该部分内容的说明如下所示。 DFT算法的原理讲解和模块开发在前几篇文章中已经完成了&#xff0c;本文介绍如何使用S-Fuction Builter模块一步到位地自动开发DFT算法模块&#xff0c;包括建立C MEX S-Fu…...

spring-boot 操作 mongodb 数据库

如何使用 spring-boot 操作 mongodb 数据库 配置文件&#xff1a; spring:data:mongodb:host: 127.0.0.1database: fly_articleDbport: 27017# 可以采取 mysql 写法# uri: mongodb://127.0.0.1/fly_articleDb依赖信息: <?xml version"1.0" encoding"UTF-…...

JVM篇---第三篇

系列文章目录 文章目录 系列文章目录一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?二、Java内存结构三、说说对象分配规则一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文…...

建筑施工行业招投标资源众包分包系统站点开发

一款针对建筑、施工行业开发的程序系统平台&#xff0c;运营方可以招募企业发布招投标信息以及招聘信息。 核心功能&#xff1a;一、项目招投标众包发布和投标 企业可以根据自身资源或者实际需求发布参与招投标信息&#xff0c;程序后台可以管理、审核用户发布的信息。参与招…...

【Linux基础】Linux发展史

&#x1f449;系列专栏&#xff1a;【Linux基础】 &#x1f648;个人主页&#xff1a;sunny-ll 一、前言 本篇主要介绍Linux的发展历史&#xff0c;这里并不需要我们掌握&#xff0c;但是作为一个合格的Linux学习者与操作者&#xff0c;这些东西是需要了解的&#xff0c;而且…...

openGauss学习笔记-90 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用重试中止事务

文章目录 openGauss学习笔记-90 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用重试中止事务 openGauss学习笔记-90 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用重试中止事务 在乐观并发控制&#xff08;OCC&#xff09;中&…...

【Docker】搭建 Docker 镜像仓库

文章目录 前言&#xff1a;公有仓库和私有仓库公共镜像仓库私有镜像仓库 一、搭建 Docker 镜像仓库1.1 搭建简化版的镜像仓库1.2 搭建带有图形化界面的镜像仓库1.3 配置 Docker 信任地址 二、向私有镜像仓库推送和拉取镜像2.1 推送本地镜像到私有仓库2.2 拉取私有仓库中的镜像 …...

Python数据攻略-Pandas的数据计算、拼接与可视化

如何将数据转化为有用的信息?在数据分析的世界里,仅仅拥有大量数据是不够的。需要有方法去“翻译”这些数据,让它们告诉我们一些有用的信息。 本篇文章要探讨的内容:如何使用Pandas进行数据计算、拼接和可视化,从而让数据“说话”。 文章目录 Pandas的数据计算基本数学运…...

【计算机网络】HTTPS协议详解

文章目录 一、HTTPS协议 介绍 1、1 HTTP协议不安全的体现 1、2 什么是 HTTPS协议 二、加密的一些概念 2、1 怎么理解加密 2、2 为什么要加密 2、3 常见的加密方式 2、2、1 对称加密 2、2、2 非对称加密 三、HTTPS协议探究加密过程 3、1 只使用对称加密 3、2 只是用非对称加密 3…...

Septentrio接收机二进制的BDS b2b改正数解码

Galileo的HAS和BDS B2b改正数为实时PPP提供了可能&#xff0c;要实现实时PPP解算&#xff0c;必须对对应的数据进行解码。由于没有做过解码的工作&#xff0c;现结合qzsl6tool代码对Septentrio的解码代码进行学习。 1. 二进制枕头的识别和解码 定义一个读取数据的类&#xff…...

向客户介绍网站建设的话本/深圳外贸seo

继续微软企业库5.0的学习之路&#xff0c;今天主要介绍的是企业库的PolicyInjection模块&#xff0c;这个模块是为了方便我们在项目中使用AOP而生的模块&#xff0c;本篇主要介绍的PolicyInjection模块信息、内置的匹配规则和内置处理模块使用。 一、PolicyInjection模块基本信…...

个人适合做什么网站/微信管理工具

一、使用TableLogic来进行逻辑删除 Data NoArgsConstructor AllArgsConstructor //TableName("t_user") public class User {TableId(value "ids",type IdType.AUTO)private Long id;//指定属性与表字段名对应TableField(value "t_name")pri…...

学做缝纫的网站/中国免费域名注册平台

缺陷的严重等级是指软件缺陷对软件质量的破坏程度&#xff0c;即软件缺陷的存在将对软件的功能和性能产生怎样的影响。 如何定义缺陷的严重等级?一般认为导致系统出现死机现象或崩溃的缺陷为致命缺陷&#xff0c;这种定义是否正确呢?假如修改系统设置项导致系统偶尔出现死机现…...

为什么wordpress/b2b电子商务平台排名

VMware在今天2012年8月23日发布了新版本VMware-workstation-full-9.0.0-812388&#xff0c;再此分享给各位热爱学习虚拟机的网友。 此次&#xff0c;VMware Workstation 的版本号一跃为9&#xff0c;和Windows 8有着密切的关系。VMware Workstation 9为Windows 8做出了全新的性…...

旅游网站做精准营销的/百度网页版主页

文章作者&#xff1a;Tyan 博客&#xff1a;noahsnail.com | CSDN | 简书 1. Description 2. Solution **解析&#xff1a;**Version 1&#xff0c;先统计数字数量&#xff0c;再用map或set判断数量是否重复。 Version 1 class Solution:def uniqueOccurrences(self, a…...

网站运营的概念/如何优化seo

2019独角兽企业重金招聘Python工程师标准>>> 1. 泛型的概念 泛型本质上就是参数化类型&#xff08;parameterized type&#xff09;。在定义类、接口、方法的时候&#xff0c;把将要操作的数据类型声明为形参。在实例化的时候&#xff0c;再传入实际的数据类型&…...