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

Spring IoC DI

Spring 框架的核心是其控制反转(IoC,Inversion of Control)和依赖注入(DI,Dependency Injection)机制。这些概念是为了提高代码的模块化和灵活性,进而简化开发和测试过程。下面将详细介绍这两个概念及其在 Spring 中的实现方式

控制反转(IoC)

控制反转是一种设计原则,用于改变程序中各个模块间的控制关系。传统的程序设计中,高层模块依赖于低层模块的实现,控制权由应用程序代码直接管理。而在 IoC 的设计中,这种控制关系被反转,控制权交给了一个专门的容器,它负责创建对象、维护它们的生命周期,以及管理依赖关系。

依赖注入(DI)

依赖注入是实现 IoC 的一种方法,主要目的是减少代码间的耦合。依赖指的是一个对象依赖于另一个对象的情况。例如,一个 Car 对象依赖一个 Engine 对象。在没有依赖注入的情况下,你可能需要在 Car 类内部创建一个 Engine 实例。但是,使用依赖注入,Engine 的实例会由外部(通常是框架或容器)注入到 Car 中。

一、控制反转(IoC)

控制反转(IoC)是一种编程理念,主要目的是减少程序中各个部分之间的依赖关系。通常,程序中的一个部分(比如一个类或对象)需要依赖另一个部分来完成一些任务。在传统的编程方法中,每个部分都需要自己去“寻找”或者“创建”它需要的其他部分。这就像你需要自己去找所有工具和材料来做饭一样。

IoC 的思想就是将这种“寻找”或“创建”的责任交给别人(在大多数框架中,这个“别人”就是一个叫做 IoC 容器的东西)。这样,每个部分就不需要自己去找它需要的其他部分了,而是像去餐厅吃饭一样,直接得到它需要的东西。这种做法的好处是,每个部分都不需要关心其他部分是怎么来的,它们只需要关心自己的工作,这样代码就更简单,更容易管理和扩展。

Spring IoC 容器的核心职责。让我们来更详细地看一下这些点:

  1. 资源集中管理

    • 在 Spring 框架中,IoC 容器负责管理应用中的各种对象(称为 beans),包括创建这些对象、维护它们的生命周期、以及管理它们之间的依赖关系。这种管理方式使得资源(如服务、数据访问对象等)的配置和维护更加集中和一致,而不是散落在各个组件中。
  2. 降低耦合度

    • 当使用 IoC 容器时,组件不需要直接创建或查找它们依赖的其他组件。相反,这些依赖会被容器注入到组件中,通常在组件创建的时候。这种方式被称为依赖注入(DI)。依赖注入有助于降低组件之间的耦合度,因为组件不需要知道如何创建它们所依赖的对象,甚至不需要知道这些对象的具体实现。这让组件的测试和维护变得更加容易。
  3. 简化资源的使用

    • 开发者不需要编写具体的创建对象或管理对象生命周期的代码,而只需通过配置来声明它们需要哪些资源。这大大简化了代码的复杂度,并允许开发者专注于业务逻辑。

二、创建Bean的方式

Spring 框架中,创建和管理 Bean 是核心功能之一。Bean 是 Spring IoC 容器管理的对象,可以通过多种方式来配置和创建。下面,我将介绍三种主要的创建 Bean 的方式:使用 XML 配置文件、使用注解(Annotation-based)、和使用 Java 配置(Java-based)。

1. 使用 XML 配置文件

在早期的 Spring 应用中,XML 配置文件被广泛使用来定义 Bean。尽管这种方式现在较少使用,了解它仍然有助于理解 Spring 的基础。

<!-- 在 applicationContext.xml 中定义一个 Bean -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 定义一个简单的 Bean --><bean id="myBean" class="com.example.MyClass"><!-- 可以配置属性或者依赖关系 --></bean></beans>

在这个例子中,MyClass 必须是一个具体的类,id 是这个 Bean 在 Spring 容器中的唯一标识符。

2. 使用注解(Annotation-based)

基于注解的配置是目前最流行的方式,由于其简洁性和易读性,许多现代 Spring 应用都采用此方法。

常用的组件扫描注解

  • @Component: 通用组件
  • @Service: 表示一个服务组件(业务逻辑层)
  • @Repository: 表示一个数据访问组件(DAO层)
  • @Controller: 表示一个控制器组件(Web 层)

启用组件扫描

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {// 这里可以定义其他的 Bean 或者配置
}

通过 @ComponentScan,Spring 会在指定的包及其子包中查找带有 @Component 及其特化形式的注解,并自动注册为 Bean。

3. 使用 Java 配置(Java-based)

这种方式通过 Java 类和方法直接定义 Bean 配置,提供了最大的灵活性和控制。

@Configuration
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}
}

yBean 方法通过 @Bean 注解标记,表明该方法将返回一个对象,该对象应被注册为 Spring 应用上下文中的一个 Bean。MyBean 可以是任何一个类,其实例将由 Spring 管理。

三、获取Bean

  使用 ApplicationContext 获取 Bean

你可以通过 Spring 的 ApplicationContext 直接获取 Bean。这种方法在任何地方都可行,但它需要你能够访问到 ApplicationContext

public class MainApp {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);User user = context.getBean(User.class);System.out.println("User Name: " + user.getName());}
}

注意Bean 的命名规范

  1. 默认命名
    • 当你在 Spring 配置中定义一个 Bean 而没有显式指定一个名字时,Spring 会为该 Bean 生成一个默认名称。默认的命名规则是将类名的第一个字母小写。例如,一个名为 UserProfile 的类会被默认命名为 userProfile
  2. 显式命名
    • 你可以在定义 Bean 时显式指定一个名字,这通常是通过 XML 文件或注解来完成的。

      • 在 XML 中:<bean id="myBean" class="com.example.MyBean"/>
      • 使用注解:@Component("myBean")@Bean(name = "myBean")
    • 显式命名允许你自定义 Bean 的名称,这对于避免命名冲突或当多个类有相同的简单名称时非常有用。

相关文章:

Spring IoC DI

Spring 框架的核心是其控制反转&#xff08;IoC&#xff0c;Inversion of Control&#xff09;和依赖注入&#xff08;DI&#xff0c;Dependency Injection&#xff09;机制。这些概念是为了提高代码的模块化和灵活性&#xff0c;进而简化开发和测试过程。下面将详细介绍这两个…...

[数据集][目标检测]无人机飞鸟检测数据集VOC+YOLO格式6647张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6647 标注数量(xml文件个数)&#xff1a;6647 标注数量(txt文件个数)&#xff1a;6647 标注…...

Vue 中 watch 的使用方法及注意事项

前言 Vue 的 Watch 是一个非常有用的功能&#xff0c;它能够监听 Vue 实例数据的变化并执行相应的操作。本篇文章将详细介绍 Vue Watch 的使用方法和注意事项&#xff0c;让你能够充分利用 Watch 来解决 Vue 开发中的各种问题。 1. Watch 是什么&#xff1f; 1.1 Watch 的作…...

情指行一体化平台建设方案和必要性-———未来之窗行业应用跨平台架构

一、平台建设必要性 以下是情指行一体化平台搭建的一些必要性&#xff1a; 1. 提高响应速度 - 实现情报、指挥和行动的快速协同&#xff0c;大大缩短从信息获取到决策执行的时间&#xff0c;提高对紧急情况和突发事件的响应效率。 2. 优化资源配置 - 整合各类资源信…...

窗口框架frame(HTML前端)

一.窗口框架 作用&#xff1a;将网页分割为多个HTML页面&#xff0c;即将窗口分为多个小窗口&#xff0c;每个小窗口可以显示不同的页面&#xff0c;但是在浏览器中是一个完整的页面 基本语法 <frameset cols"" row""></frameset><frame…...

51单片机——数码管

一、数码管原理图 我们发现&#xff0c;总共有8个数码管。 它们的上面接8个LED&#xff0c;用来控制选择哪个数码管。例如要控制第三个数码管&#xff0c;就让LED6为0&#xff0c;其他为1&#xff0c;那LED又接到哪呢&#xff1f; 二、LED 由图可以看出&#xff0c;这个一个1…...

`re.compile(r“(<.*?>)“)` 如何有效地从给定字符串中提取出所有符合 `<...>` 格式的引用

regexp re.compile(r"(<.*?>)") 这行代码是在Python中使用正则表达式的一个示例&#xff0c;具体含义如下&#xff1a; re.compile(): 这个函数来自Python的 re&#xff08;正则表达式&#xff09;模块&#xff0c;用于将一个正则表达式模式编译成一个正则表…...

算法打卡:第十一章 图论part01

今日收获&#xff1a;图论理论基础&#xff0c;深搜理论基础&#xff0c;所有可达路径&#xff0c;广搜理论基础&#xff08;理论来自代码随想录&#xff09; 1. 图论理论基础 &#xff08;1&#xff09;邻接矩阵 邻接矩阵存储图&#xff0c;x和y轴的坐标表示节点的个数 优点…...

为C#的PetaPoco组件增加一个批量更新功能(临时表模式)

总有一些数据是需要批量更新的&#xff0c;并且更新的字段&#xff0c;每个数据都不一样。 为了实现这样一个功能&#xff0c;写了这样一个方法&#xff1a; using System.Linq.Expressions; using System.Reflection; using System.Text; using NetRube.Data; using PetaPoc…...

Spring实战——入门讲解

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 Spring介绍 Spring实战的入门讲解主要涵盖了Spring框架的基本概念、核心功能以及应用场景。以下是关于Spring实战入门的具体介绍&#xff1a; Spring框架概述&#xff1a;Spring是一个轻量级的Java开发框架…...

MTK芯片机型的“工程固件” 红米note9 5G版资源预览 写入以及改写参数相关步骤解析

小米机型:小米5 小米5x 米6 米6x 米8 米9 米10系列 米11系列 米12系列 mix mix2 mix2s mix3 max max2 max3 note3 8se 9se cc9系列 米play 平板系列等分享 红米机型:红米note4 红米note4x 红米note5 红米note6 红米note7 红米note8 红米note8pro 红米s2 红米note7pro 红米…...

[Golang] Context

[Golang] Context 文章目录 [Golang] Context什么是context创建context创建根context创建context context的作用并发控制context.WithCancelcontext.WithDeadlinecontext.WithTimeoutcontext.WithValue 什么是context Golang在1.7版本中引入了一个标准库的接口context&#xf…...

【JAVA集合总结-壹】

文章目录 synchronized 的实现原理以及锁优化&#xff1f;ThreadLocal原理&#xff0c;使用注意点&#xff0c;应用场景有哪些&#xff1f;synchronized和ReentrantLock的区别&#xff1f;说说CountDownLatch与CyclicBarrier 区别Fork/Join框架的理解为什么我们调用start()方法…...

Mysql梳理7——分页查询

目录 7、分页查询 7.1 背景 7.2 实现规则 分页原理 7.3 使用 LIMIT 的好处 7、分页查询 7.1 背景 背景1&#xff1a;查询返回的记录太多了&#xff0c;查看起来很不方便&#xff0c;怎么样能够实现分页查询呢&#xff1f; 背景2&#xff1a;表里有 4 条数据&#xff0c…...

智能制造与工业互联网公益联播∣企企通副总经理杨华:AI的浪潮下,未来智慧供应链迭代方向

近两年在IT圈子里面&#xff0c;AI毫无疑问是最火的一个词语&#xff0c;最近的ChatGPT、文心一言、通义千问&#xff0c;从千亿参数到万亿参数&#xff0c;再往前就是Sora文生视频异军突起... 在人工智能的浪潮下&#xff0c;AI之于供应链的价值体现在哪些地方&#xff1f;其发…...

《深度学习》—— 卷积神经网络(CNN)的简单介绍和工作原理

文章目录 一、卷积神经网络的简单介绍二、工作原理(还未写完)1.输入层2.卷积层3.池化层4.全连接层5.输出层 一、卷积神经网络的简单介绍 基本概念 定义&#xff1a;卷积神经网络是一种深度学习模型&#xff0c;通常用于图像、视频、语音等信号数据的分类和识别任务。其核心思想…...

数据结构:线性表

1、线性表概述 1.1线性表的定义 线性表&#xff08;list&#xff09;&#xff1a;零个或多个数据元素的有限序列。 简单地来说&#xff0c;我们可以用下面这张图来描述一个线性表&#xff1a; 1.2 线性表的存储结构 1.2.1顺序存储结构——顺序表 顺序表是将数据全部存储到…...

Ansible PlayBook实践案例

一、PlayBook介绍 1.什么是playbook playbook 顾名思义&#xff0c;即剧本&#xff0c;现实生活中演员按照剧本表演&#xff0c;在 ansible 中&#xff0c;由被控计算机表演,进行安装&#xff0c;部署应用&#xff0c;提供对外的服务等&#xff0c;以及组织计算机处理各种各样…...

Tomcat后台弱口令部署war包

1.环境搭建 cd /vulhub/tomcat/tomcat8 docker-compose up -d 一键启动容器 2.访问靶场 点击Manager App tomcat8的默认用户名和密码都是tomcat进行登录 3.制作war包 先写一个js的一句话木马 然后压缩成zip压缩包 最后修改后缀名为war 4.在网站后台上传war文件 上传war文件…...

胤娲科技:DeepMind的FermiNet——带你穿越“薛定谔的早餐桌”

当AI遇上量子迷雾&#xff0c;FermiNet成了你的“量子导航仪” 想象一下&#xff0c;你早晨醒来&#xff0c;发现家里的厨房变成了薛定谔的实验室&#xff0c;你的咖啡杯和吐司同时处于“存在与不存在”的叠加态。 你伸手去拿&#xff0c;却不确定会不会摸到冰冷的空气或是热腾…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...