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

Spring框架IOC

目录

一、Spring框架的介绍

1.1 Spring框架的概述

1.2 Spring框架的优点

 二、Spring的核心 IOC技术

2.1 什么是IOC

2.2 IOC的程序入门

2.3 IOC技术总结

2.4 Spring框架的Bean管理的配置文件方式 


一、Spring框架的介绍

1.1 Spring框架的概述

Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring的核心是控制反转(IoC控制反转)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

1.2 Spring框架的优点

1.方便解耦,简化开发,Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理。(IOC的作用)

2.AOP编程的支持,Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。可扩展性

3.声明式事务的支持,只需要通过配置就可以完成对事务的管理,而无需手动编程。

4.方便程序的测试,Spring对Junit4支持,可以通过注解方便的测试Spring程序。

5.方便集成各种优秀框架,Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持。

6.降低JavaEE API的使用难度,Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。

 二、Spring的核心 IOC技术

2.1 什么是IOC

IOC -- Inverse of Control,控制反转,将对象的创建权力反转给Spring框架!!

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

解决问题:使用IOC可以解决的程序耦合性高的问题!!Spring的工厂读取配置文件。

2.2 IOC的程序入门

项目中的目录结构:

controller(表现层):

controller层的功能为请求和响应控制
controller层负责前后端交互,接受前端请求,调用service层,接收service层返回的数据,最后返回具体的页面和数据到客户端

dao(持久层):也被称为mapper层

dao层的作用为访问数据库,向数据库发送sql语句,完成数据的增删改查任务

pojo(数据库实体类):也被称为entity层,model层

一般数据库一张表对应一个实体类,类属性同表字段一一对应

service(业务层):
service层的作用为完成功能设计
service层调用dao层接口,接收dao层返回的数据,完成项目的基本功能设计

utils(工具类):

存放了一些公共部分的工具类,主要是用于减少项目开发中的重复代码

步骤:

① 创建普通maven Java工程不需要界面所以不用创建web项目,需要导入spring依赖,所以创建普通maven Java项目即可,导入坐标依赖

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>

② 编写接口和实现类,编写具体的实现方法

package com.qcby.service;/*** 业务层接口* 用户模块接口* 目的:演示springIOC入门*/
public interface UserService {//接口中的抽象方法public void hello();
}
package com.qcby.service.impl;import com.qcby.service.UserService;/*** 用户模块实现类实现用户模块接口* 实现其抽象方法* 耦合度低*/
public class UserServiceImpl implements UserService {//实现入门@Overridepublic void hello() {System.out.println("Hello IOC!!");}}

③ 编写Spring核心的配置文件,在 src/main/resources 目录下创建 applicationContext.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--IOC管理bean--><!--bean的意义是将该类的创建对象权力转给spring框架--><bean id="userService" class="com.qcby.service.impl.UserServiceImpl" /></beans>

④ 把log4j.properties的配置文件拷贝到 src/main/resources 目录下,做为 log4j 的日志配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><param name="Encoding" value="UTF-8"/><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n"/></layout></appender><logger name="java.sql"><level value="debug"/></logger><logger name="org.apache.ibatis"><level value="info"/></logger><root><level value="debug"/><appender-ref ref="STDOUT"/></root>
</log4j:configuration>

⑤ 编写测试方法

package com.qcby.demo;import com.qcby.service.UserService;
import com.qcby.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 测试类* 测试UserService交给spring管理* IOC入门*/
public class UserServiceTest {@Testpublic void run1(){UserService userService = new UserServiceImpl();UserService userService1 = new UserServiceImpl();userService.hello();userService1.hello();System.out.println(userService);System.out.println(userService1);}@Testpublic void run2(){// 使用Spring的工厂ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 通过工厂获得类:UserService userService = (UserService) applicationContext.getBean("userService");UserService userService1 = (UserService) applicationContext.getBean("userService");userService.hello();userService1.hello();System.out.println(userService);System.out.println(userService1);}
}

运行 run1() 方法,可以看到,使用new方法直接创建对象是创建了两个不同的对象,这种做法在某些情况下可能会导致资源浪费,所以我们选择 run2() 的方法进行创建对象

运行 run2() 方法,可以看到,虽然创建了两个对象,但他们两个是单例,是相同的,只创建了一个对象,可以对之前创建的对象进行重复使用(使用这种方法也可以选择多例进行创建,默认是单例,可以在bean中进行属性设置也可以达成 run1() 中效果)

2.3 IOC技术总结

ApplicationContext接口,工厂的接口,使用该接口可以获取到具体的Bean对象。

该接口下有两个具体的实现类:

ClassPathXmlApplicationContext,加载类路径下的Spring配置文件,使用方法如下:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

FileSystemXmlApplicationContext,加载本地磁盘下的Spring配置文件,使用方法如下:

ApplicationContext applicationContext = new FileSystemXmlApplicationContext("C:\\Users\\ZSW\\Desktop\\idea\\SpringIOC\\src\\main\\resources\\applicationContext.xml");

推荐使用ClassPathXmlApplicationContext,因为第二种写的是本地磁盘下的绝对路径,在真正开发项目时不易修改使用

2.4 Spring框架的Bean管理的配置文件方式 

id属性,自己对Bean起的名字,在约束中采用ID的约束,唯一,取值要求:必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号 id:不能出现特殊字符

class属性,Bean对象的全路径

scope属性,scope属性代表Bean的作用范围

        singleton单例(默认值),最常用的方式

        prototype多例

Bean对象的创建和销毁的两个属性配置:

说明:Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法

init-method,当bean被载入到容器的时候调用init-method属性指定的方法

destroy-method,当bean从容器中删除的时候调用destroy-method属性指定的方法

相关文章:

Spring框架IOC

目录 一、Spring框架的介绍 1.1 Spring框架的概述 1.2 Spring框架的优点 二、Spring的核心 IOC技术 2.1 什么是IOC 2.2 IOC的程序入门 2.3 IOC技术总结 2.4 Spring框架的Bean管理的配置文件方式 一、Spring框架的介绍 1.1 Spring框架的概述 Spring是一个开放源代码的…...

有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?

想找个 “免费” 的 ERP 软件&#xff1f; 咱得知道&#xff0c;ERP 那可是涉及财务、人力、供应链、采购、销售等好多方面的重要企业软件。功能这么全&#xff0c;能免费才怪呢&#xff01;真要是有免费的&#xff0c;早就火遍大江南北&#xff0c;说不定把市场都垄断了&…...

思科CCNA认证都学什么考什么?

关注 工 仲 好&#xff1a;IT运维大本营CCNA考试要学的东西很多&#xff0c;你不要看它只是一个初级认证&#xff0c;但是它的专业内容知识是不少的&#xff0c;你想要学好也是需要下一番苦功的。 那么考CCNA需要学哪些东西呢&#xff1f;下面我们就来了解一下吧。 01、考CCN…...

模型部署学习笔记——模型部署关键知识点总结

模型部署学习笔记——模型部署关键知识点总结 模型部署学习笔记——模型部署关键知识点总结1. CUDA中Grid和Block的定义是什么&#xff1f;Shared Memory的定义&#xff1f;Bank Conflict的定义&#xff1f;Stream和Event的定义&#xff1f;2. TensorRT的工作流程&#xff1f;3…...

22智能 狄克斯特拉算法复习

狄克斯特拉算法 图 根据边有无方向分为&#xff1a; 有向图、无向图 根据边有无权重变量分为&#xff1a; 有权图、无权图 根据顶点是否连通分为&#xff1a; 连通图和非连通图入度&#xff1a;表示有多少条边指向该顶点出度&#xff1a;表示有多少条边从该顶点指出算法步骤&a…...

首个!艾灵参编的工业边缘计算国家标准正式发布

近日&#xff0c;艾灵参与编制的《面向工业应用的边缘计算 应用指南》&#xff08;以下简称《标准》&#xff09;国家标准正式发布&#xff0c;将于2025年5月1日起实施。这一里程碑式的成果&#xff0c;不仅标志着我国在工业边缘计算技术标准化领域取得了重大突破&#xff0c;成…...

curl也支持断点续传

curl断点续传 访问外网资源&#xff0c;特别是Github上比较大的资源&#xff0c;例如&#xff0c;笔者遇到的calico发布包&#xff0c;经常会遇到在浏览器上下载半途中断。 那么支持断点续传的下载工具&#xff0c;就是应对这种情况的好帮手&#xff01; 简单的断点续传工具…...

交换机链路聚合(手动负载分担模式)(eNSP)

目录 交换机SW_C配置: 交换机-PC划分vlan: 交换机-交换机端口聚合: 交换机SW_D配置: 交换机-PC划分vlan: 交换机-交换机端口聚合: 验证: 链路聚合的端口清除: 交换机端口聚合的存在意义主要有以下几点: 增加带宽 提高冗余性和可靠性 实现负载均衡 降低成本 …...

jmeter 接口性能测试 学习笔记

目录 说明工具准备工具配置jmeter 界面汉化配置汉化步骤汉化结果图 案例1&#xff1a;测试接口接口准备线程组添加线程组配置线程组值线程数&#xff08;Number of Threads&#xff09;Ramp-Up 时间&#xff08;Ramp-Up Period&#xff09;循环次数&#xff08;Loop Count&…...

`HashMap`、`Hashtable` 和 `HashSet`的区别

HashMap、Hashtable 和 HashSet 都是 Java 中常用的集合类&#xff0c;它们的功能和实现有所不同&#xff0c;尽管它们都使用哈希表&#xff08;hash table&#xff09;作为底层数据结构。以下是它们之间的主要区别&#xff1a; 1. HashMap 和 Hashtable 的区别 特性HashMapH…...

Arduino中解析JSON数据

JSON JSON&#xff08;JavaScript Object Notation&#xff0c;即JavaScript对象表示法&#xff09;是一种广泛采用的开放标准文件格式与数据交换格式。它兼具人类可读性和机器易解析性&#xff0c;使得数据的编写、阅读、生成及解析都变得十分便捷。JSON的设计不依赖于特定编…...

linux----文件访问(c语言)

linux文件访问相关函数 打开文件函数 - open 函数原型&#xff1a;int open(const char *pathname, int flags, mode_t mode);参数说明&#xff1a; pathname&#xff1a;这是要打开的文件的路径名&#xff0c;可以是绝对路径或者相对路径。例如&#xff0c;"/home/user/…...

源码分析之Openlayers中MousePosition鼠标位置控件

概述 本文主要介绍 Openlayers 中的MousePosition鼠标位置控件&#xff0c;该控件会创建一个元素在页面的右上方用来实时显示鼠标光标的位置坐标。该控件在实际应用很有效&#xff0c;可以实时获取鼠标位置&#xff0c;但是一般控件元素都会自定义。 源码分析 MousePosition…...

以ATTCK为例构建网络安全知识图

ATT&CK&#xff08;Adversarial Tactics, Techniques, and Common Knowledge &#xff09;是一个攻击行为知识库和模型&#xff0c;主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念&#xff0c;并探讨通过ATT&a…...

myexcel的使用

参考&#xff1a; &#xff08;1&#xff09;api文档&#xff1a;https://www.bookstack.cn/read/MyExcel-2.x/624d8ce73162300b.md &#xff08;2&#xff09;源代码&#xff1a; https://github.com/liaochong/myexcel/issues 我&#xff1a; &#xff08;1&#xff09;m…...

Unity 上好用的插件

PlayerMaker BehaviorDesigner Cinemachine Timeline Hybrid Addressable AssetBundle Blower Simple Zoom 大地图上缩放和平移使用ScrollRect的好效果实现...

Vivado - 远程调试 + 远程综合实现 + vmWare网络配置 + NFS 文件共享 + 使用 VIO 核

目录 1. 简介 2. VIO 配置 2.1 VIO IP 2.2 VIO 对比 ILA 3. VIO 示例 3.1 Led 3.1.1 工程配置 3.1.2 效果展示 3.2 Key 3.2.1 工程配置 3.2.1 效果展示 3.3 门控触发 3.3.1 工程配置 3.3.2 效果展示 4. 远程调试 4.1 配置目标主机 4.2 配置本机 4.3 vmWare 网…...

双臂机器人

目录 一、双臂机器人简介 二、双臂机器人系统的组成 三、双臂机器人面临的主要挑战 3.1 协调与协同控制问题 3.2 力控制与柔顺性问题 3.3 路径规划与轨迹优化问题 3.4 感知与环境交互 3.5 人机协作问题 3.6 能源与效率问题 3.7 稳定性与可靠性问题 四、双臂机器人…...

【Lua热更新】上篇

Lua 热更新 - 上篇 下篇链接&#xff1a;【Lua热更新】下篇 文章目录 Lua 热更新 - 上篇一、AssetBundle1.理论2. AB包资源加载 二、Lua 语法1. 简单数据类型2.字符串操作3.运算符4.条件分支语句5.循环语句6.函数7. table数组8.迭代器遍历9.复杂数据类型 - 表9.1字典9.2类9.3…...

Ubuntu批量修改文件名

文章目录 批量重命名文件&#xff1a;Ubuntu下使用find命令结合sed和mv参考 批量重命名文件&#xff1a;Ubuntu下使用find命令结合sed和mv 在日常开发和文件管理中&#xff0c;有时我们需要批量重命名一批文件&#xff0c;比如将文件名中的某个特定字符串替换为另一个字符串。…...

Wi-Fi/5G信号解码背后的数学:深入浅出图解LLR软解调原理

Wi-Fi/5G信号解码背后的数学&#xff1a;深入浅出图解LLR软解调原理 在数字通信的世界里&#xff0c;信号从发射端到接收端的旅程就像一场充满干扰的马拉松。当你的手机接收Wi-Fi或5G信号时&#xff0c;它获取的并不是完美的0和1序列&#xff0c;而是被噪声扭曲的"模糊版本…...

Prodigal基因预测工具:3天快速掌握原核生物基因发现终极指南

Prodigal基因预测工具&#xff1a;3天快速掌握原核生物基因发现终极指南 【免费下载链接】Prodigal Prodigal Gene Prediction Software 项目地址: https://gitcode.com/gh_mirrors/pr/Prodigal 你是否正在寻找一款快速、准确的原核生物基因预测工具&#xff1f;Prodiga…...

PHP Intelephense与Composer依赖管理:提升PHP开发效率的终极指南

PHP Intelephense与Composer依赖管理&#xff1a;提升PHP开发效率的终极指南 【免费下载链接】vscode-intelephense PHP intellisense for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-intelephense 在PHP开发中&#xff0c;PHP Intelephen…...

2026年238个好发CCF-A的强化学习idea全面汇总!

最近强化学习领域迎来重磅进展&#xff01;强化学习之父R.S.Sutton 提出了一种全新的范式&#xff1a;Intentional Updates机制&#xff01;其不再盲目预设步长&#xff0c;而是先设定一个预期的输出改变目标&#xff0c;实现了内存消耗降低10-100倍的同时&#xff0c;性能依然…...

别再只画区间了!用ECharts的markArea实现单点高亮标注(附完整代码)

突破ECharts标记边界&#xff1a;用markArea实现单点高亮的高级技巧 在数据可视化领域&#xff0c;ECharts凭借其强大的功能和灵活的配置选项&#xff0c;已成为前端开发者和数据分析师的首选工具之一。当我们面对需要突出显示特定数据点的场景时&#xff0c;常规做法是使用mar…...

不止于测试:用GStreamer打造你的树莓派低成本视频监控/图传系统

树莓派视频监控实战&#xff1a;用GStreamer构建低成本图传系统 树莓派搭配普通USB摄像头能做什么&#xff1f;大多数人可能只想到简单的视频采集测试。但如果你掌握GStreamer这个多媒体框架的进阶用法&#xff0c;就能将它变成一套功能完整的视频监控或无线图传系统。本文将彻…...

2025届学术党必备的AI辅助写作方案实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 跟着学术钻研持续深入&#xff0c;开题报告身为钻研项目要紧起点&#xff0c;它的质量径直作…...

保姆级教程:用ESP32-S3和LVGL驱动3.5寸ILI9488屏幕(附常见编译错误解决)

ESP32-S3与LVGL实战&#xff1a;3.5寸ILI9488屏幕驱动全攻略与疑难解析 当创客们第一次拿到ESP32-S3开发板和3.5寸ILI9488屏幕时&#xff0c;往往会陷入既兴奋又困惑的状态——硬件连接看似简单&#xff0c;但真正要让屏幕亮起来并显示内容&#xff0c;却可能遭遇各种"坑…...

DeepSeek推理服务崩溃频发?3类隐蔽内存泄漏Bug的精准捕获与48小时修复方案

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek推理服务崩溃频发&#xff1f;3类隐蔽内存泄漏Bug的精准捕获与48小时修复方案 典型泄漏模式识别 DeepSeek-R1/V2推理服务在高并发长周期运行中频繁OOM&#xff0c;经pprof火焰图与heap profile交叉分…...

从ADC采样到FFT分析:手把手教你用STM32F407的DSP库搞定频谱计算

从ADC采样到FFT分析&#xff1a;手把手教你用STM32F407的DSP库搞定频谱计算 在工业振动监测、音频信号处理和电源质量分析等场景中&#xff0c;频谱分析是理解信号特征的关键技术。STM32F407凭借其Cortex-M4内核和硬件FPU&#xff0c;配合CMSIS-DSP库&#xff0c;能够高效实现实…...