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

【Spring 篇】Spring:轻松驾驭 Java 世界的利器

在这里插入图片描述

在 Java 开发领域,Spring 框架无疑是一颗璀璨的明星,它不仅提供了全面的企业级特性,还为开发者提供了简便而强大的开发方式。本文将深入探讨 Spring 框架的简介、配置和快速入门,带你轻松驾驭 Java 世界的利器。

Spring 简介

Spring 是一个综合性的框架,它的设计目标是降低企业级 Java 开发的复杂性。Spring 提供了全方位的解决方案,包括依赖注入、面向切面编程、事务管理、数据访问、消息传递等多个领域。Spring 框架的核心是 IoC(Inversion of Control,控制反转)和 AOP(Aspect-Oriented Programming,面向切面编程)。

IoC(控制反转)

控制反转是 Spring 框架的核心思想之一。在传统的开发中,对象的创建和管理由开发者负责,而在 Spring 中,这种控制被反转了。IoC 让 Spring 容器负责创建和管理对象,开发者只需要关注业务逻辑即可。

Spring 使用 Bean 容器来实现 IoC。Bean 容器是 Spring 框架的核心容器,负责创建、管理和装配 Bean。Bean 是 Spring 管理的对象,它们由 Spring 容器初始化、装配和管理。

AOP(面向切面编程)

面向切面编程是 Spring 框架的另一个核心思想。AOP 提供了一种方法,允许开发者在程序执行的特定切点上插入自定义的行为,而无需修改源代码。这样可以更好地实现横切关注点的复用和分离。

Spring 的 AOP 支持使用纯 Java 编程风格或 XML 配置来定义切面。通过 AOP,开发者可以将一些横切关注点(如事务管理、日志记录、性能监控等)从业务逻辑中分离出来,使得代码更加模块化和清晰。

Spring 配置

Spring 的配置方式主要有两种:XML 配置和注解配置。接下来我们将分别介绍这两种配置方式。

XML 配置

XML 配置是 Spring 最经典的配置方式之一,它使用 XML 文件来描述 Spring Bean 以及它们之间的依赖关系。

基本配置

下面是一个简单的 Spring XML 配置文件的例子:

<!-- applicationContext.xml --><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"><!-- 定义一个名为 "helloWorld" 的 Bean --><bean id="helloWorld" class="com.example.HelloWorld"><!-- 设置属性值 --><property name="message" value="Hello, Spring!" /></bean></beans>

在这个例子中:

  • <beans> 元素是配置文件的根元素,定义了 Spring 容器。
  • <bean> 元素定义了一个 Spring Bean,其中 id 属性指定了 Bean 的唯一标识符,class 属性指定了 Bean 的类型。
  • <property> 元素用于设置 Bean 的属性值。
注入依赖

在 Spring 中,Bean 之间的依赖关系可以通过构造函数注入或者属性注入来实现。以下是一个使用构造函数注入的例子:

<!-- applicationContext.xml --><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"><!-- 定义一个名为 "textEditor" 的 Bean --><bean id="textEditor" class="com.example.TextEditor"><!-- 使用构造函数注入依赖 --><constructor-arg ref="spellChecker" /></bean><!-- 定义一个名为 "spellChecker" 的 Bean --><bean id="spellChecker" class="com.example.SpellChecker" /></beans>

在这个例子中,textEditor Bean 依赖于 spellChecker Bean,通过构造函数注入。constructor-arg 元素的 ref 属性指定了依赖的 Bean。

配置文件引入

为了更好地组织配置文件,可以使用 <import> 元素将多个配置文件组合在一起。例如:

<!-- mainApplicationContext.xml --><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"><!-- 引入其他配置文件 --><import resource="classpath:applicationContext.xml" /><import resource="classpath:databaseContext.xml" /></beans>

这样,可以将不同功能的配置拆分到不同的文件中,使得配置更加清晰和易于维护。

注解配置

除了 XML 配置外,Spring 还支持使用注解进行配置。注解配置更加简洁直观,可以减少大量的 XML 代码。

组件扫描

使用 @ComponentScan 注解开启组件扫描,Spring 将会自动扫描指定包及其子包下的类,将带有 @Component 或其他特定注解的类注册为 Bean。

// AppConfig.java@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}

在这个例子中,@Configuration 注解表示这是一个配置类,@ComponentScan 注解指定了扫描的基础包。

声明 Bean

使用 @Bean 注解声明一个 Bean:

// AppConfig.java@Configuration
public class AppConfig {@Beanpublic HelloWorld helloWorld() {return new HelloWorld();}@Beanpublic TextEditor textEditor() {return new TextEditor(spellChecker());}@Beanpublic SpellChecker spellChecker() {return new SpellChecker();}
}

在这个例子中,helloWorld()textEditor()spellChecker() 方法分别声明了三个 Bean,并通过 @Bean 注解告诉 Spring 如何创建它们。

Spring 快速入门

现在我们将通过一个简单的例子来展示如何使用 Spring 进行快速开发。假设我们有一个图书管理系统,我们将创建一个 Book 类和一个 BookService 类。

Book 类
// Book.javapublic class Book {private String title;private String author;// 省略构造函数、getter 和 setter 方法
}
BookService 类
// BookService.java@Service
public class BookService {@Autowiredprivate BookRepository bookRepository;public List<Book> getAllBooks() {return bookRepository.findAll();}public void saveBook(Book book) {bookRepository.save(book);}
}

在这个例子中,BookService 类使用了 @Service 注解,表明它是一个服务类,由 Spring 管理。@Autowired 注解表示通过自动装配的方式注入 BookRepository,省去了手动创建的步骤。

BookRepository 类
// BookRepository.java@Repository
public class BookRepository {private List<Book> books = new ArrayList<>();public List<Book> findAll() {return books;}public void save(Book book) {books.add(book);}
}

BookRepository 类使用了 @Repository 注解,表明它是一个仓库类,负责数据存储。这里简单地使用一个列表模拟数据库操作。

测试类
// Main.javapublic class Main {public static void main(String[] args) {// 初始化 Spring 容器AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 获取 BookService BeanBookService bookService = context.getBean(BookService.class);// 创建一本书Book book = new Book();book.setTitle("Spring in Action");book.setAuthor("Craig Walls");// 保存书bookService.saveBook(book);// 获取所有书籍并打印List<Book> allBooks = bookService.getAllBooks();for (Book b : allBooks) {System.out.println("Title: " + b.getTitle() + ", Author: " + b.getAuthor());}// 关闭 Spring 容器context.close();}
}

在这个例子中,我们使用 AnnotationConfigApplicationContext 类来初始化 Spring 容器,并通过 getBean() 方法获取 BookService Bean。然后,我们创建一本书并保存,最后打印所有书籍信息。

结语

Spring 框架以其强大的功能和灵活的配置方式成为 Java 开发领域的佼佼者。本文简要介绍了 Spring 框架的核心思想,详细解释了 XML 和注解两种配置方式,并通过一个简单的例子演示了 Spring 的快速入门。希望通过本文的介绍,读者能够更好地理解和使用 Spring 框架,轻松驾驭 Java 世界的利器。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

相关文章:

【Spring 篇】Spring:轻松驾驭 Java 世界的利器

在 Java 开发领域&#xff0c;Spring 框架无疑是一颗璀璨的明星&#xff0c;它不仅提供了全面的企业级特性&#xff0c;还为开发者提供了简便而强大的开发方式。本文将深入探讨 Spring 框架的简介、配置和快速入门&#xff0c;带你轻松驾驭 Java 世界的利器。 Spring 简介 Sp…...

八个LOGO素材网站推荐分享

即时设计资源广场 在UI界面设计中&#xff0c;为了找到合适的图标icon&#xff0c;你有没有尝试过翻遍整个网络&#xff0c;找到自己想要的&#xff0c;却无法下载或收费使用&#xff1f;最后&#xff0c;只收集图标icon材料需要半天时间。专业设计师使用的图标icon设计材料“…...

React格式化规范

React并没有特定的格式要求&#xff0c;它允许开发者根据自己的喜好和项目需求来选择代码的格式化风格。然而&#xff0c;在React社区中有一些常见的约定和最佳实践&#xff0c;以下是一些常用的格式化规范和建议&#xff1a; 缩进&#xff1a;使用2个或4个空格来进行缩进&…...

如何利用Conda管理多种虚拟环境与Jupyter Notebook内核切换

写在开头 在数据科学与机器学习领域,项目之间可能存在不同的依赖关系和版本要求。为了有效管理这些差异,使用虚拟环境成为一种标准实践。本文将介绍如何利用Conda这一强大的环境管理工具,结合Jupyter Notebook,使得在不同项目之间灵活切换变得轻而易举。 2. Conda简介 2…...

博客摘录「 什么是QPS、TPS、吞吐量?- 高并发名词概念」2024年1月5日

1.什么是高并发&#xff1f; 高并发&#xff08;High Concurrency&#xff09;。通常是指系统在短时间内的大量操作。 高并发相关的常见指标有&#xff1a;QPS、TPS、吞吐量、并发数等。 2.QPS&#xff08;Query Per Second&#xff09; QPS每秒查询率&#xff0c;是指系统…...

PTA——逆序的三位数

程序每次读入一个正3位数&#xff0c;然后输出按位逆序的数字。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如输入700&#xff0c;输出应该是7。 输入格式&#xff1a; 每个测试是一个3位的正整数。 输出格式&#xff1a; 输出按位逆序…...

ChatGPT怎么帮我上班的

1.解放生产力 1&#xff09;标准格式&#xff0c;完美输出。GPT对于公文等具有一定标准格式的文件&#xff0c;可以进行完美仿写&#xff0c;随随便便以假乱真那都是小菜一碟&#xff0c;这对于经常要开展规范成文的人来说&#xff0c;简直就是个福音&#xff0c;只要前期调教…...

WPF 漂亮长方体、正文体简单实现方法 Path实现长方体 正方体方案 WPF快速实现长方体、正方体的方法源代码

这段XAML代码在WPF中实现了一个类似长方体视觉效果的图形 声明式绘制&#xff1a;通过Path、PathGeometry和PathFigure等元素组合&#xff0c;能够以声明方式精确描述长方体每个面的位置和形状&#xff0c;无需编写复杂的绘图逻辑&#xff0c;清晰直观。 层次结构与ZIndex控制…...

Nginx(十三) 配置文件详解 - 反向代理(超详细)

本篇文章主要讲ngx_http_proxy_module和ngx_stream_proxy_module模块下各指令的使用方法。 1. 代理请求 proxy_pass 1.1 proxy_pass 代理请求 Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except 设置代理服务器的协议和地址以…...

谷歌浏览器启用实时字幕功能

在 Chrome 中使用“实时字幕”功能 - Google Chrome帮助 在 Chrome 中使用“实时字幕”功能 从计算机上的 Chrome 浏览器中&#xff0c;您可以使用“实时字幕”功能自动为视频、播客、游戏、直播、视频通话或其他音频媒体生成字幕。音频和字幕均在本地处理&#xff0c;并会保…...

php接口优化 使用curl_multi_init批量请求

PHP使用CURL同时抓取多个URL地址 抓取多个URL地址是Web开发中常见的需求&#xff0c;使用PHP的curl库可以简化这个过程。本文将详细介绍如何使用PHP的curl库同时请求多个URL地址&#xff0c;并提供具体的代码案例和注释。 curl库介绍 curl是一个常用的开源网络传输工具&…...

联邦拜占庭共识算法的工作流程

1 前言 联邦拜占庭共识算法&#xff08;Federated Byzantine Agreement&#xff0c;简称FBA&#xff09;是一种解决分布式系统中拜占庭问题的共识算法&#xff0c;是拜占庭容错共识算法里的其中一种&#xff0c;主要应用于区块链技术中。这种算法允许系统内部的各种节点自由进…...

国家开放大学形成性考核 统一考试 学习资料参考

试卷代号&#xff1a;11119 机械CAD/CAM 参考试题 一、单项选择题&#xff08;从所给的四个选项中&#xff0c;找出你认为是正确的答案&#xff0c;将其编号填入括号内。每小题3分&#xff0c;共45分&#xff09; 1.下述CAD/CAM过程的概念中&#xff0c;属于CAM范畴的是&am…...

2401C++,实现文件服务器和聊天室

文件服务器 使用yalantinglibs,几行代码开发静态文件服务器 最近的workshop上的一个任务,就是实现一个文件服务器,只要设置下载目录之后,就可下载目录里面的文件. 看看用yalantinglibs怎么实现一个静态文件服务器的吧. coro_http::coro_http_server server(1, 9001); server.…...

【ESP-NOW 入门(ESP32 with Arduino IDE)】

ESP-NOW 入门(ESP32 with Arduino IDE) 1. 前言2. Arduino集成开发环境3. ESP-NOW 简介3.1 ESP-NOW 支持以下功能:3.2 ESP-NOW 技术还存在以下局限性:4. ESP-NOW 单向通信4.1 一个 ESP32 开发板向另一个 ESP32 开发板发送数据4.2 一个“主”ESP32 向多个 ESP32“slave”发送…...

PHP序列化总结2--常见的魔术方法

魔术方法的概念 PHP的魔术方法是一种特殊的方法&#xff0c;用于覆盖PHP的默认操作。它们以双下划线&#xff08;__&#xff09;开头&#xff0c;后面跟着一些特定的字符串&#xff0c;如__construct()、__destruct()、__get()等。这些魔术方法在对象执行特定操作时被自动调用…...

Docker 入门 ------容器互通以及Dockerfile

1. 端口映射以及容器互联 Docker 除了通过网络访问&#xff0c;还提供了两种很方便的功能来满足服务访问的基本需求&#xff1a; 允许映射容器内应用的服务端口到本地宿主主机互联机制实现多个容器间通过容器名来快速访问 1.1 容器映射实现访问容器 1.1.1 从外部访问容器应…...

AI绘图模型不会写字的难题解决了

介绍 大家好&#xff0c;最近有个开源项目比较有意思&#xff0c;解决了图像中不支持带有中文的问题。 https://github.com/tyxsspa/AnyText。 为什么不能带有中文&#xff1f; 数据集局限 Stable Diffusion的训练数据集以英文数据为主&#xff0c;没有大量包含其他语言文本的…...

vue-cli创建项目时由esLint校验导致报错或警告的问题及解决

vue-cli创建项目时由esLint校验导致报错或警告的问题及解决 一、万能办法 一、万能办法 //就是在报错的JS文件中第一行写上 /* eslint-disable */链接: https://www.yii666.com/blog/288808.html 其它的方法我遇见了再补充...

uniapp:实现手机端APP登录强制更新,从本地服务器下载新的apk更新,并使用WebSocket,实时强制在线用户更新

实现登录即更新&#xff0c;或实时监听更新 本文介绍的是在App打开启动的时候调用更新&#xff0c;点击下方链接&#xff0c;查看使用WebSocket实现实时通知在线用户更新。 uniapp&#xff1a;全局消息是推送&#xff0c;实现app在线更新&#xff0c;WebSocket&#xff0c;ap…...

设计循环队列——oj题622

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;LeetCode刷题|数据结构|Linux 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 题目要求&#xff1a;应该支持如下操作&#xff1a;示例&#xff1a;提示&#xff1a; 结构体定义队列的创建基本操作判断队列是否为空&#xf…...

阿里后端实习一面面经

阿里后端实习一面面经 项目中使用到了es&#xff0c;es的作用&#xff1f; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 es中的重要概念&#xff1f; 群集&#xff1a;一个或多个节点…...

element-ui组件DatePicker日期选择器移动端兼容

element-ui组件DatePicker日期选择器移动端兼容 css /** 移动端展示 **/ media screen and (max-width: 500px) {.el-picker-panel__sidebar {width: 100%;}.el-picker-panel {width: 400px!important;}.el-picker-panel__content {width: 100%;}.el-picker-panel__body{marg…...

burpsuite 爆破

靶场搭建:phpstudy的安装与靶场搭建 - junlin623 - 博客园 (cnblogs.com) 账号字典:XXTK: 一些弱口令、fuzz字典 (gitee.com) 网盘链接:https://pan.baidu.com/s/1v5pAwaTwoeCnJgkUXf3iLQ?pwd=mllm 提取码:mllm --来自百度网盘超级会员V2的分享 一、暴力破解 - 基于…...

SparkSQL基础解析(三)

1、 Spark SQL概述 1.1什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块&#xff0c;它提供了2个编程抽象&#xff1a;DataFrame和 DataSet&#xff0c;并且作为分布式SQL查询引擎的作用。 我们已经学习了Hive&#xff0c;它是将Hive SQL转换成MapReduce然后提…...

gz-hamonic 安装提示缺少许多依赖无法安装

在软件更新源中增加gz-hamonic的软件源&#xff0c; 点击添加&#xff0c;在输入框中填入如下语句&#xff1a; deb http://packages.osrfoundation.org/ubuntu jammy main 如图所示&#xff1a; 然后执行 sudo apt -get install gz-hamonic即可安装。 如下图 在终端中输入…...

新版Edge卸载

新版Edge卸载&#xff1a;步骤与注意事项 随着Windows 10的发布&#xff0c;微软推出了新版Edge浏览器。虽然新版Edge浏览器具有许多优秀的新功能和改进&#xff0c;但有时您可能希望卸载它并使用其他浏览器。在本文中&#xff0c;我们将向您介绍如何卸载新版Edge浏览器&#…...

Ansibe自动化基础

目录 一.Ansibe自动化概述 1.特点 2.工作特性 3.应用场合 二.ansibe安装即相关文件说明 1.安装 2.相关文件 3.主配置文件内容详解 4.ansibe运行机制 三.ansibe管理节点命令 1.Ansibe 四.主机组配置 1.基本配置 第一种&#xff1a; 第二种&#xff1a; 2.设置SSH…...

2023 年中国高校大数据挑战赛赛题B DNA 存储中的序列聚类与比对-解析与参考代码

题目背景&#xff1a;目前往往需要对测序后的序列进行聚类与比对。其中聚类指的是将测序序列聚类以判断原始序列有多少条&#xff0c;聚类后相同类的序列定义为一个簇。比对则是指在聚类基础上对一个簇内的序列进行比对进而输出一条最有 可能的正确序列。通过聚类与比对将会极大…...

决策树--分类决策树

1、介绍 ① 定义 分类决策树通过树形结构来模拟决策过程&#xff0c;决策树由结点和有向边组成。结点有两种类型&#xff1a;内部结 点和叶结点。内部结点表示一个特征或属性&#xff0c;叶子节点表示一个类。 ② 生成过程 用决策树分类&#xff0c;从根结点开始&#xff…...

oa软件开发/优化防疫措施+科学精准防控

2017年3月22号&#xff0c;一场主题为“新开始”的全球智慧建筑盛会在阿里巴巴西溪园区盛大召开。会场布置随处体现科技感&#xff0c;参会者人脸识别自助签到&#xff0c;不仅可以通过数据大屏实时查看人行轨迹、人员分布、环境空气质量&#xff1b;更能直观感受从建筑中夜以继…...

wordpress post id/深圳网站建设推广

>0️⃣python数据结构与算法学习路线 >学习内容&#xff1a; >- 基本算法&#xff1a;枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等... >- 数据结构&#xff1a;字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组…...

偷dede网站模板/合肥网站优化推广方案

众所周知&#xff0c;SQL的查询快慢直接影响用户的使用体验&#xff0c;而一个SQL的执行速度主要取决于它采用何种执行计划&#xff0c;在常年累月的系统使用中&#xff0c;数据的不断积累&#xff0c;很可能曾经飞快的SQL变得颤颤巍巍&#xff0c;一秒十卡。其幕后元凶就是表数…...

网站后台编辑器不能用/今年疫情最新消息

站长之家(ChinaZ.com) 4月1日 消息&#xff1a;最近&#xff0c;一款名叫DeepL的在线机器翻译软件在日本大火。这款翻译软件的牛逼之处不仅是能准确地翻译日语、英语等多国语言&#xff0c;而且它还可以精准翻译方言、文言文甚至学术论文。经数据测试&#xff0c;DeepL不仅从字…...

石家庄市市政建设总公司网站/百度百度一下官网

DML 添加数据 insert into 表名 where 条件 修改数据 update 表名 where 条件 删除数据 delete from where 条件 DQL 查询语句 select 【distinct去重】 字段列表 as ‘别名’ from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段…...

成都水高新区建设局官方网站/谷歌app下载

1. HTTP 的URL 以http:// 开头&#xff0c;而HTTPS 的URL 以https:// 开头2. HTTP 是不安全的&#xff0c;而 HTTPS 是安全的3. HTTP 标准端口是80 &#xff0c;而 HTTPS 的标准端口是4434. 在OSI 网络模型中&#xff0c;HTTP工作于应用层&#xff0c;而HTTPS 工作在传输层5. H…...