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

JavaEE简单示例——Spring的控制反转

简单介绍:

在之前的入门程序中,我们简单的介绍了关于Spring框架中的控制反转的概念,这次我们就来详细的介绍和体验一下Spring中的控制反转的理论和实操。

使用方法:

控制反转(IoC)是面向对象编程中的一个设计原则,用于降低代码之间的耦合度。

在传统的面向对象编程中,获取对象的方式使用关键字”new“主动创建一个对象,也就是说,应用程序掌握着对象的控制权。在使用Spring框架之后,对象的实例不再由调用者创建,而是由Spring的IoC容器来创建,IoC容器会负责控制程序之前的关系,而不是由调用者的成都代码直接控制。

IoC设计原则是借助于IoC容器实现具有依赖关系对象之间的解耦,各个对象封装之后,通过IoC容器来关联这些对象类。这样对象类与对象类之间就通过IoC容器进行联系,而对象类与对象类之间没有什么直接联系。

引用程序引入IoC容器之后,在客户端类中将不再创建对象类,而是直接从IoC容器中获取所需的对象类中。

这句话就是IoC的和核心思想,说白了,就是将我们之前通过new关键字创建对象的过程,替换成使用IoC容器中的getBean()方法来获取我们所需要的对象。

代码实现:

我们再复习一下之前我们的Spring的入门程序中的操作步骤:

1.首先在pom文件中引入Spring的Maven坐标

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>SpringDemo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><!--Spring IOC--><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.21.RELEASE</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>test</scope></dependency></dependencies>
</project>

2.创建Java对象类

package com.spring;public class user {private int id;private String name;public void show(){System.out.println("你好"+name);}@Overridepublic String toString() {return "user{" +"id=" + id +", name='" + name + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public user(int id, String name) {this.id = id;this.name = name;}public user() {}
}

3.编辑Bena管理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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user" class="com.spring.user"><property name="id" value="1"/><property name="name" value="张三"/></bean></beans>

4.编写测试类进行测试

import com.spring.user;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestUser {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("userBeanContext.xml");user u = (user) context.getBean("user");System.out.println(u.toString());}
}

这些是创建一个入门程序的大致步骤,然后接下来,如果上一个案例中我们成功的运行出结果,那么现在我们可以继续使用这个案例文件,我们来看一下运行结果:

就是输出user类的信息这个简单的案例。我们要体会的有两个部分,首先就是我们的创建对象部分,我们并没有出现 user u = new user()的语句,也就是说我们没有出现new user()的过程,而是通过IoC的容器中获取到了user对象,其中,ClassPathXmlApplicationContext()就是我们所说的Ioc容器,getBean()方法就是我们所有的由IoC容器来获取对象类,也就是用getBean()方法去代替我们的new关键字。

IoC的另一个作用:我们并不关心类的依赖关系,我们只需要知道我们应该获取那个对象即可

关于Bean的依赖关系属于是管理和维护Bean的方面,而IoC在Bean的管理方面的理念是,对于我们来说,我们并不需要关心Bean是如何来的,以及类的依赖关系,而是侧重于我们只需要知道我们需要获取的对象即可。那么我们也会以代码的形式来将理论融入到实践中

我们现在添加一个新的类,起名叫做student:

package com.spring;public class student {private int id;private String name;@Overridepublic String toString() {return "com.spring.student{" +"id=" + id +", name='" + name + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public student(int id, String name) {this.id = id;this.name = name;}public student() {}
}

我们让user类去依赖这个类,所谓的依赖关系,就是user类中有一个属性是student类。

当我们创建user类的时候,我们会需要先创建student类,这就是类的依赖关系。在之前的传统的开发中,遇到一个类需要依赖另一个类的时候,我们需要先创建另一个类,之后才能创建需要的类,但是在Spring框架中,IoC会帮我们完成这种依赖关系,具体的配置文件如下: 

第一个红色框是我们被依赖的类,也就是student类,而在user类中,我们创建一个新的属性,它的类型就是student,然后我们使用一个特殊的属性ref,这个属性的全称叫做reference(引用),这个属性是用来给引用数据类型赋值的,这个属性的值指向我们创建被依赖的类的<bean>标签的id的值,对应到我们的案例中也就是创建student的<bean>标签的id的值,之后我们继续在测试类中执行我们之前的代码即可

运行结果:

可以看到,我们只是得到了user类,但是我们输出的时候依然得到了student类的数据,也就是说它其实隐藏了一个创建student并且赋值给user类的过程并没有让我们看见,或者说并不需要我们去关心,这就是IoC帮我们自动维护了类之间的依赖关系,我们只需要明确我们需要那个对象并从IoC容器中获取即可。 

注意点:

注意,虽然我们不需要关心student类的创建和赋值的过程,但是我们依然需要一个<bean>标签去指向student的类,并且在user类中使用ref属性指向student的<bean>的id,这样才能让Spring知道这两个类是一个依赖的关系

相关文章:

JavaEE简单示例——Spring的控制反转

简单介绍&#xff1a; 在之前的入门程序中&#xff0c;我们简单的介绍了关于Spring框架中的控制反转的概念&#xff0c;这次我们就来详细的介绍和体验一下Spring中的控制反转的理论和实操。 使用方法&#xff1a; 控制反转&#xff08;IoC&#xff09;是面向对象编程中的一个…...

DBT 收购 Transform,指标平台已成现代数据栈关键拼图

今年 2 月初&#xff0c;现代数据技术栈独角兽 DBT 宣布完成对 Transform 的并购。在现代数据栈的体系中&#xff0c;DBT 和 Transform 都扮演着重要角色&#xff0c;DBT 侧重于整个分析链路上的数据转换处理&#xff0c;而 Transform 则聚焦在以指标为中心搭建业务分析应用。 …...

@Value注解取不到值的几种错误

在程序中使用了yml文件,然后把有些参数写在里面作为全局变量,在定时器里面使用,但是后来发现取不到: @Value("${spring.datasource.druid.master.url}") private String url; @Value("${spring.datasource.druid.master.driver-class-name}") private …...

听客户说|东台农商银行:建立健全数据安全管理制度的探索与实践

夯实银行数据安全&#xff0c;需“规划先行、谋定后动”&#xff0c;首要工作是确立管理工作的行动纲要&#xff0c;并据此建立制度保障体系以贯彻纲要&#xff0c;而后才是具体的行动措施和日常检查、监测。从银行数据安全建设实践路径来说&#xff0c;我认为可以用“盘现状、…...

Benchbot环境安装记录

https://github.com/qcr/benchbot 第一次安装这种复合型的环境&#xff0c;包括了各种CUDA/NVIDA驱动、Docker环境、python环境等等。因此&#xff0c;遇到了一大堆的问题&#xff0c;在此记录一下亲测有效的博客&#xff1a; https://zhuanlan.zhihu.com/p/378894743 https:/…...

Barrett模乘与蒙哥马利模乘算法

一、背景 公钥密码学(Public-Key Cryptography, PKC)由Diffie与Hellman于1970年代提出,在现代信息社会中得到了广泛应用。此后基于各种数学困难问题,越来越多的公钥密码算法被设计出来,比如RSA、ElGamal、椭圆曲线ECC算法等。在RSA算法中,模幂(modular exponentiation)…...

slice方法

slice方法与splice方法相比slice方法不会修改原数组一、语法以及描述说明&#xff1a;通过start 和 end对原数组进行浅拷贝&#xff08;提取 start 至 end 索引的数组元素&#xff09;语法&#xff1a;Array.slice([start[, end])参数&#xff1a;start : 开始索引end : 结束索…...

DevOps工具集合

简介 DevOps&#xff08;Development和Operations的组合词&#xff09;是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#xff09;、技术运营和质量保障&#xff08;QA&#xff09;部门之间的沟通、协作与整合。 它是一种重视“软件开…...

手把手教你安装Linux!!!

文章目录Linux简述它们的区别安装CentOS①下载CentOS②安装Linux有两种方式③下载模拟软件④安装vmware⑤创建虚拟机⑥安装操作系统Linux简述 在国内比较流行的两款Linux发行版本CentOS和ubuntu 它们的区别 ubuntu&#xff1a;页面更加的华丽比较漂亮&#xff0c;它对计算机…...

图像分割(Unet算法学习笔记)

知识提要 数据集使用VOC2012 CNN 卷积神经网络Convolutional Neural Network GPU图像处理单元Graphic Processing Unit)图形处理器 convolution 卷积 ReLU全名Rectified Linear Unit&#xff0c;意思是修正线性单元 bn全称Batch Normalization批标准化 FC全连接神经网络是一种…...

Fortinet 发布《2022下半年度全球威胁态势研究报告》,七大发现值得关注

全球网络与安全融合领域领导者Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;&#xff0c;近日发布《2022 下半年度全球威胁态势研究报告》。报告指出&#xff0c;相对于组织攻击面的不断扩大以及全球威胁态势的持续演进&#xff0c;网络犯罪分子设计、优化技术与战术…...

ThinkPHP 6.1 模板篇之循环和选择标签

本文主要介绍在视图模板中&#xff0c;如何使用循环和选择标签去渲染变量及常用循环和选择标签。 目录 循环标签 foreach 标签 for 标签 volist 标签 选择标签 switch 标签 if 标签 范围标签 原生标签 总结 循环标签 foreach 标签 将查找到的数组或数据集&#xff…...

Jetpack太香了,让开发效率提升了不少

作者&#xff1a;Jingle_zhang 第三方App使用Jetpack等开源框架非常流行&#xff0c;在Gradle文件简单指定即可。然而ROM内置的系统App在源码环境下进行开发&#xff0c;与第三方App脱节严重&#xff0c;采用开源框架的情况并不常见。但如果系统App也集成了Jetpack或第三方框架…...

【软考中级信安】第四章--网络安全体系与网络安全模型

1.网络安全体系概述1.1 网络安全体系概念网络安全体系&#xff1a;是网络安全保障系统的最高层概念抽象&#xff0c;是由各种网络安全单元按照一定的规则组成的&#xff0c;共同实现网络安全的目标。1.2 网络安全体系特性整体性&#xff1a;网络安全单元按照一定规则&#xff0…...

四、GC分析内存调优

文章目录&#xff08;持续更新中... ...&#xff09;GC分析&内存调优工具篇JDK自带的工具jconsolejvisualvm第三方工具arthas&#xff08;重要&#xff09;jprofiler&#xff08;收费的&#xff09;MAT、GChisto、gcviewer、GC Easy&#xff08;待完善&#xff09;参数、命…...

如何快速开发一套分布式IM系统

架构说明&#xff1a; 1&#xff09;CIM 中的各个组件均采用 SpringBoot 构建&#xff1b;2&#xff09;采用 Netty Google Protocol Buffer 构建底层通信&#xff1b;3&#xff09;Redis 存放各个客户端的路由信息、账号信息、在线状态等&#xff1b;4&#xff09;Zookeeper …...

W806|CKLINK LITE|调试|elf文件模板|CSDK|Debug|学习(4):CKLINK调试W806

一、硬件连接 接线方式 &#xff08;连线颜色供参考&#xff0c;本例中采用图示颜色&#xff09;&#xff1a; 注意&#xff1a;CKLINK LITE的3V3须与W806的3V3相连&#xff0c;或者给W806开发板单独供电&#xff0c;两种方式均可。 ​ 否则&#xff0c;会提示“the referenc…...

【100个 Unity实用技能】 ☀️ | 脚本无需挂载到游戏对象上也可执行的方法

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…...

「IT女神勋章」挑战赛#

缓存 本地缓存 本地缓存为了保证线程安全问题&#xff0c;一般使用ConcurrentMap的方式保存在内存之中 分布式缓存。 常见的分布式缓存则有Redis&#xff0c;MongoDB等。 一致性&#xff1a;本地缓存由于数据存储于内存之中&#xff0c;每个实例都有自己的副本&#xff0c…...

易优cms user 登录注册标签

user 登录注册标签 user 登录注册入口标签 [基础用法] 标签&#xff1a;user 描述&#xff1a;动态显示购物车、登录、注册、退出、会员中心的入口&#xff1b; 用法&#xff1a; {eyou:user typeuserinfo} <div id"{$field.htmlid}"> …...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...