当前位置: 首页 > 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}"> …...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

scan_mode设计原则

scan_mode设计原则 在进行mtp controller设计时&#xff0c;基本功能设计完成后&#xff0c;需要设计scan_mode设计。 1、在进行scan_mode设计时&#xff0c;需要保证mtp处于standby模式&#xff0c;不会有擦写、编程动作。 2、只需要固定mtp datasheet说明的接口即可&#xf…...

电脑定时关机工具推荐

软件介绍 本文介绍一款轻量级的电脑自动关机工具&#xff0c;无需安装&#xff0c;使用简单&#xff0c;可满足定时关机需求。 工具简介 这款关机助手是一款无需安装的小型软件&#xff0c;文件体积仅60KB&#xff0c;下载后可直接运行&#xff0c;无需复杂配置。 使用…...

【Redis】Redis 的持久化策略

目录 一、RDB 定期备份 1.2 触发方式 1.2.1 手动触发 1.2.2.1 自动触发 RDB 持久化机制的场景 1.2.2.2 检查是否触发 1.2.2.3 线上运维配置 1.3 检索工具 1.4 RDB 备份实现原理 1.5 禁用 RDB 快照 1.6 RDB 优缺点分析 二、AOF 实时备份 2.1 配置文件解析 2.2 开启…...

在 Vue 的template中使用 Pug 的完整教程

在 Vue 的template中使用 Pug 的完整教程 引言 什么是 Pug&#xff1f; Pug&#xff08;原名 Jade&#xff09;是一种高效的网页模板引擎&#xff0c;通过缩进式语法和简洁的写法减少 HTML 的冗长代码。Pug 省略了尖括号和闭合标签&#xff0c;使用缩进定义结构&#xff0c;…...

Prompt工程学习之思维树(TOT)

思维树 定义&#xff1a;思维树&#xff08;Tree of Thoughts, ToT&#xff09; 是一种先进的推理框架&#xff0c;它通过同时探索多条推理路径对思维链&#xff08;Chain of Thought&#xff09;** 进行了扩展。该技术将问题解决视为一个搜索过程 —— 模型生成不同的中间步骤…...

深度学习学习率优化方法——pytorch中各类warm up策略

warm-up具体原理以及为什么这么做在之前的博客有介绍&#xff0c;这里直接介绍如何直接使用pytorch中的warm-up策略&#xff0c;在pytorch中对于warm-up所有支持的方法都有描述&#xff0c;可以直接阅读1。 深度学习中各类学习率优化方法(AdaGrad/RMSprop/Adam/Warm-UP)原理及其…...