控制反转(IOC)——Spring第一个核心思想

news2025/1/11 22:19:10

控制反转概述

        控制反转(IoC)是一种将对象的创建、组装和管理交给容器或框架来实现的编程思想。它可以减低对象之间的耦合度,提高代码的灵活性和模块化。控制反转的一种常见形式是依赖注入(DI),即对象的依赖(需要的资源)由外部实体提供,而不是由对象本身创建。控制反转也可以通过事件驱动编程或模板方法模式来实现。

控制反转实现方式

xml方式

语法

<bean id="对象名称" class="需要创建类的全限定类名"/> 

bean标签详解

id:给对象在容器中提供一个唯一标识。用于获取对象。

class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。

scope:指定对象的作用范围。

* singleton :默认值,单例的.

* prototype :多例的.

name:映射路径名称

factory-bean:工厂bean名称

factory-method:工厂方法

lazy-init:懒加载配置

* false :默认值,关闭懒加载.

* true :开启懒加载.

init-method:初始化方法

destroy-method:销毁方法

创建方式

第一种方式:使用默认无参构造函数
<!--在默认情况下: 
它会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败。--> 
<bean id="accountService" class="com.xszx.service.impl.AccountServiceImpl"/> 
第二种方式:spring 管理静态工厂-使用静态工厂的方法创建对象
/** 
* 模拟一个静态工厂,创建业务层实现类 
*/ 
public class StaticFactory { 
public static IAccountService createAccountService(){ 
return new AccountServiceImpl(); 
} 
} 
<!-- 此种方式是: 
使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器 
id 属性:指定 bean 的 id,用于从容器中获取 
class 属性:指定静态工厂的全限定类名 
factory-method 属性:指定生产对象的静态方法 
--> 
<bean id="accountService" 
class="com.xszx.factory.StaticFactory" 
factory-method="createAccountService"></bean> 
第三种方式:spring 管理实例工厂-使用实例工厂的方法创建对象
/** 
* 模拟一个实例工厂,创建业务层实现类 
* 此工厂创建对象,必须现有工厂实例对象,再调用方法 
*/ 
public class InstanceFactory { 
public IAccountService createAccountService(){ 
return new AccountServiceImpl(); 
} 
} 
<!-- 此种方式是: 
先把工厂的创建交给 spring 来管理。 
然后在使用工厂的 bean 来调用里面的方法 
factory-bean 属性:用于指定实例工厂 bean 的 id。 
factory-method 属性:用于指定实例工厂中创建对象的方法。 
--> 
<bean id="instancFactory" class="com.xszx.factory.InstanceFactory"></bean> 
<bean id="accountService" 
factory-bean="instancFactory" 
factory-method="createAccountService"></bean>

注解方式

beans.xml中追加配置

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd

<!--    开启注解驱动-->
    <context:annotation-config/>
<!--    开启组件扫描-->
    <context:component-scan base-package="com.xszx"></context:component-scan>

第一套注解(通用注解)

//等同于<bean id="userController" class="com.xszx.controller.UserController"></bean>
//如果需要指定名称,则使用@Component(value="aaa")
@Component
public class UserController{
    
}

第二套注解(个性化注解)

@Controller
public class UserController {}
@Service
public class UserServiceImpl implements UserService {}
@Repository
public class UserDaoImpl implements UserDao {}

依赖注入实现方式

        依赖注入(Dependency Injection,DI)是一种设计模式,它通过将对象之间的依赖关系的创建和维护转移到外部容器中来,以减少对象之间的紧耦合性并提高可重用性。在传统的程序设计中,对象通常通过直接创建和维护依赖关系来使用其他对象,这会导致对象之间的紧耦合性,使代码难以维护和扩展。然而,依赖注入模式将对象之间的依赖关系的创建和维护转移到外部容器中,使得对象之间的耦合性降低,并且可以方便地更改依赖项的实现类,而无需修改受影响的对象的代码。

        依赖注入通常有两种方式:设值注入和构造注入。设值注入是通过客户端类的公共属性或setter方法提供依赖性。构造注入则是通过在客户端类的构造函数中传递依赖项来实现。在Spring框架中,依赖注入是其核心特性之一,它通过Spring容器来管理对象的生命周期和依赖关系,从而实现解耦和灵活的配置。

        总的来说,依赖注入是一种有效的设计模式,它能够帮助开发者降低代码之间的耦合性,提高代码的可重用性和可维护性,是构建高质量软件的重要工具之一。

XML方式

手动注入

Set方法注入
<!--property:set方法注入
name:(需要寻找被注入方的set方法)set+name名称的首字母大写
ref:需要引用的bean标签id名称
value:简单的属性值-->
<bean id="userController" class="com.xszx.controller.UserController">
    <property name="userService" ref="userService"></property>
    <property name="age" value="12"></property>
</bean>
构造方法注入
<!--constructor-arg:构造方法注入
name:构造方法中的形参名称
ref:需要引用的bean标签id名称
value:简单的属性值
-->
<bean id="userController" class="com.xszx.controller.UserController">
    <constructor-arg name="age" value="12"></constructor-arg>
    <constructor-arg name="userService" ref="userService"></constructor-arg>
</bean>

自动注入

Set方法注入
byName注入

        通过指定名称对应被注入方的set方法名称,可以有多个类型,但是需要有一个唯一的名字与之对应

<bean id="userController" class="com.xszx.controller.UserController" autowire="byName"></bean>
byType注入

        通过注入的类型来自动匹配相关的bean,但是需要提供唯一的一个类型bean

<bean id="userController" class="com.xszx.controller.UserController" autowire="byType"></bean>
构造方法注入

        通过指定构造方法注入

<bean id="userController" class="com.xszx.controller.UserController" autowire="constructor"></bean>

注解方式

beans.xml中追加配置

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd

<!--    开启注解驱动-->
    <context:annotation-config/>
<!--    开启组件扫描-->
    <context:component-scan base-package="com.xszx"></context:component-scan>
第一套注解
//set方法上标注注解
//默认按照类型注入
//如果需要指定名称注入,追加@Qualifier(value = "bbb")
@Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
第二套注解
//默认是按照byName方式注入,如果没有匹配则通过byType注入
//如果需要指定名称注入,追加@Qualifier(value = "bbb")
//@Resource还有两个重要的属性:name和type,用来显式指定byName和byType方式注入
@Resource
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

 求赞求赞,关注一下我吧,各位大官人!!!给大家磕一个!!!

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

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

相关文章

Godot模拟实现多人游戏平滑移动

最近几天接触到Godot,发现是一个很不错的免费开源游戏引擎,游戏本身实现了多人对战游戏之间同步功能(好像更适合于即时对战类,而且对战人数对计算机的性能要求高); 如果要实现一个大型的游戏,1个服务端(长期运行)对应N多个客户端(随时运行)需要怎么实现,不知道是不…

Rust到底值不值得学

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust是近两年呼声比较高的一种新型开发语言&#xff0c;市场占有量并不大&#xff0c;但增长速度极为迅猛。 有人统计过&#xff0c;…

【访客管理系统】基于低代码+golang+人脸识别技术实现的访客管理系统

概述 访客预约-审批-核验流程 5个步骤&#xff1a;生成邀约 -> 访客填写信息 -> 企业员工审批 -> 访客获取凭证 -> 访客核验入园 访客核验方式 4种方式&#xff1a;二维码&#xff0c;身份证&#xff0c;人证核验&#xff0c;人脸识别 工作台 资料管理 园区管…

消息可靠性

若支付服务和mq之前网络链接失败/mq挂掉/交易服务挂掉,都有可以让支付订单无法更新,所以导致发送者不可靠,mq本身不可靠,消费者不可靠,消息延迟,针对以下问题 生产者可靠性 支付服务和mq之间有可能连不上,连不上怎么办,可以增加失败重连 配置文件中配置-重连 测试结果…

栈相关的算法

抽象&#xff1a; 不能处理的信息&#xff1a;暂时入栈。 能处理的信息&#xff1a;从栈里面选择信息&#xff0c;加工处理&#xff0c;并出栈。 一、括号匹配算法 左括号等待匹配&#xff0c;所以入栈等待匹配。 右边括号就要判断是否匹配&#xff0c;所以判断是否匹配并出…

如何设置PowerBI报告展示在屏幕的大小?

问题描述: 业务部门同事反馈&#xff0c;将开发的Power BI报告发布到Power BI服务站点后&#xff0c;用户通过不同尺寸的电子设备打开报告看到的效果不一样&#xff0c;如用PC打开报告可以在一屏中完整显示所有报告可视化组件如图&#xff1a; 但是用手机或者PAD类小尺寸电子设…

【好书推荐】值得深读的EMC参考书籍

以下排序不分先后&#xff0c;都是好书&#xff01; 书名&#xff1a;Electromagnetic Compatibility Engineering 作者&#xff1a;Henry W. Ott 这本书的讨论重点放在了经济高效的EMC设计上&#xff0c;并将数学的数量和复杂度保持在最低限度&#xff0c;辅以 250 多个带有…

【Qt笔记】Qt建立UDP通信

目录 一、前言 二、服务端 ①在项目配置文件中加入network模板 ②创立一个继承自QObject的UdpServer的类 ③构造函数的实现 ④读取信息函数的实现 三、客户端 ①绑定服务端的IP地址和端口号 ②发送数据报给服务端 四、实现效果 一、前言 UDP&#xff08;User Datagr…

流苏马兜铃Aristolochia fimbriata参考基因组

推荐官网&#xff0c;一个和无油樟一样没发生过全基因组复制事件的代表性物种。 文章同链接 如何获取mostly单拷贝和strictly单拷贝基因 Insights into angiosperm evolution, floral development and chemical biosynthesis from the Aristolochia fimbriata genome https:…

微服务CI/CD实践(一)环境准备及虚拟机创建

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;gitlabs部署 微服务CI/CD实践&#xff08;三&#xff09;nexus3部署 微服务CI/CD实践&#xff08;四&#xff09;数据库,redis,n…

天猫商品评论API:获取商品热门评价与最新评价

天猫&#xff08;Tmall&#xff09;作为中国最大的B2C电商平台之一&#xff0c;提供了丰富的商品和服务。然而&#xff0c;天猫并没有直接公开一个通用的API来允许第三方开发者直接获取商品的热门评价或最新评价。这主要是出于保护用户隐私、防止恶意抓取和滥用数据等考虑。 不…

SpringIoCDI

前言&#x1f440;~ 上一章我们介绍了Spring MVC&#xff0c;今天介绍Spring核心功能之一IoC Spring到底是什么&#xff1f; Spring IoC 什么是 IoC 容器&#xff1f; IoC 介绍 DI 介绍 IoC详解 获取Bean对象的其他方式 Bean的存储 方法注解 Bean 扫描路径 DI详解 …

计算机网络——TCP协议与UDP协议详解(下)

一、TCP协议 1.1 TCP协议的报文 TCP全称为 "传输控制协议(Transmission Control Protocol")。人如其名&#xff0c;要对数据的传输进行一个详细的控制。我们先看其报文格式&#xff0c;如下图&#xff1a; TCP报文由以下几个字段组成&#xff1a; 源端口号和目标端口…

【第三版 系统集成项目管理工程师】第13章 监控过程组

持续更新。。。。。。。。。。。。。。。 【第三版】第十三章 监控过程组 13.1控制质量13.1.1主要输入1.项目管理计划-P4992.项目文件-P4993.批准的变更请求-P5004.可交付成果-P5005.工作绩效数据-P500 13.1.2主要工具与技术1.数据收集-P5002.数据分析-P5003.检查-P5014.测试/…

数据结构—— 初识二叉树

1.树概念及结构 1.1树的概念 树是由根和子树构成 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 1. 树有…

安卓设备使用Linux运行Python sklearn进行机器学习. 2024-08-19

0. 测试环境 设备: 国美u7 系统: 安卓7.1(armv8a) 工具软件termux: Termux GitHub linux发行版: archlinux (aarch64) 1. Android手机安装termux (1)下载与安装termux : Releases termux/termux-app GitHub 根据设备处理器和系统框架选择适宜的最新版本. 这里我选择: …

krita安装krita_ai_diffusion插件后没有AI image generation

为krita 安装krita_ai_diffusion插件后却找不到AI image generation&#xff0c; 开始以为是插件安装问题&#xff0c;但发现插件安装是正确的&#xff1b; 既然安装正确&#xff0c;却看不到&#xff0c;应该是设置的问题&#xff0c;折腾了一下&#xff0c;发下是设置-》面板…

如何获取mostly单拷贝和strictly单拷贝基因

参考这篇文章的有意思的分析脚本~ 如何严格定义单拷贝基因的类型&#xff0c;值得思考。 Insights into angiosperm evolution, floral development and chemical biosynthesis from the Aristolochia fimbriata genome https://github.com/yihenghu/Aristolochia_fimbriata_…

数据驱动下的优化渠道管理与决策支持

在当今竞争激烈的市场环境中&#xff0c;渠道管理作为企业连接产品与消费者的重要桥梁&#xff0c;其效率与效果直接关系到企业的市场竞争力和可持续发展能力。随着大数据技术的广泛应用&#xff0c;数据驱动下的优化渠道管理与决策支持正成为企业提升管理效能、精准把握市场脉…

企业网站制作流程,企业网页怎么制作

​企业网站建设&#xff0c;需要对自身的需求进行分析&#xff0c;确定网站的基本功能和定位。这包括确定网站的目标受众、内容类型、功能模块、风格定位等方面。只有明确了需求&#xff0c;才能为后续的网站建设提供指导。 01、网站建设流程 02、网站制作多少钱 一、网站制…