【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 开发领域,Spring 框架无疑是一颗璀璨的明星,它不仅提供了全面的企业级特性,还为开发者提供了简便而强大的开发方式。本文将深入探讨 Spring 框架的简介、配置和快速入门,带你轻松驾驭 Java 世界的利器。 Spring 简介 Sp…...
八个LOGO素材网站推荐分享
即时设计资源广场 在UI界面设计中,为了找到合适的图标icon,你有没有尝试过翻遍整个网络,找到自己想要的,却无法下载或收费使用?最后,只收集图标icon材料需要半天时间。专业设计师使用的图标icon设计材料“…...
React格式化规范
React并没有特定的格式要求,它允许开发者根据自己的喜好和项目需求来选择代码的格式化风格。然而,在React社区中有一些常见的约定和最佳实践,以下是一些常用的格式化规范和建议: 缩进:使用2个或4个空格来进行缩进&…...
如何利用Conda管理多种虚拟环境与Jupyter Notebook内核切换
写在开头 在数据科学与机器学习领域,项目之间可能存在不同的依赖关系和版本要求。为了有效管理这些差异,使用虚拟环境成为一种标准实践。本文将介绍如何利用Conda这一强大的环境管理工具,结合Jupyter Notebook,使得在不同项目之间灵活切换变得轻而易举。 2. Conda简介 2…...
博客摘录「 什么是QPS、TPS、吞吐量?- 高并发名词概念」2024年1月5日
1.什么是高并发? 高并发(High Concurrency)。通常是指系统在短时间内的大量操作。 高并发相关的常见指标有:QPS、TPS、吞吐量、并发数等。 2.QPS(Query Per Second) QPS每秒查询率,是指系统…...
PTA——逆序的三位数
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。 输入格式: 每个测试是一个3位的正整数。 输出格式: 输出按位逆序…...
ChatGPT怎么帮我上班的
1.解放生产力 1)标准格式,完美输出。GPT对于公文等具有一定标准格式的文件,可以进行完美仿写,随随便便以假乱真那都是小菜一碟,这对于经常要开展规范成文的人来说,简直就是个福音,只要前期调教…...
WPF 漂亮长方体、正文体简单实现方法 Path实现长方体 正方体方案 WPF快速实现长方体、正方体的方法源代码
这段XAML代码在WPF中实现了一个类似长方体视觉效果的图形 声明式绘制:通过Path、PathGeometry和PathFigure等元素组合,能够以声明方式精确描述长方体每个面的位置和形状,无需编写复杂的绘图逻辑,清晰直观。 层次结构与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 浏览器中,您可以使用“实时字幕”功能自动为视频、播客、游戏、直播、视频通话或其他音频媒体生成字幕。音频和字幕均在本地处理,并会保…...
php接口优化 使用curl_multi_init批量请求
PHP使用CURL同时抓取多个URL地址 抓取多个URL地址是Web开发中常见的需求,使用PHP的curl库可以简化这个过程。本文将详细介绍如何使用PHP的curl库同时请求多个URL地址,并提供具体的代码案例和注释。 curl库介绍 curl是一个常用的开源网络传输工具&…...
联邦拜占庭共识算法的工作流程
1 前言 联邦拜占庭共识算法(Federated Byzantine Agreement,简称FBA)是一种解决分布式系统中拜占庭问题的共识算法,是拜占庭容错共识算法里的其中一种,主要应用于区块链技术中。这种算法允许系统内部的各种节点自由进…...
国家开放大学形成性考核 统一考试 学习资料参考
试卷代号:11119 机械CAD/CAM 参考试题 一、单项选择题(从所给的四个选项中,找出你认为是正确的答案,将其编号填入括号内。每小题3分,共45分) 1.下述CAD/CAM过程的概念中,属于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的魔术方法是一种特殊的方法,用于覆盖PHP的默认操作。它们以双下划线(__)开头,后面跟着一些特定的字符串,如__construct()、__destruct()、__get()等。这些魔术方法在对象执行特定操作时被自动调用…...
Docker 入门 ------容器互通以及Dockerfile
1. 端口映射以及容器互联 Docker 除了通过网络访问,还提供了两种很方便的功能来满足服务访问的基本需求: 允许映射容器内应用的服务端口到本地宿主主机互联机制实现多个容器间通过容器名来快速访问 1.1 容器映射实现访问容器 1.1.1 从外部访问容器应…...
AI绘图模型不会写字的难题解决了
介绍 大家好,最近有个开源项目比较有意思,解决了图像中不支持带有中文的问题。 https://github.com/tyxsspa/AnyText。 为什么不能带有中文? 数据集局限 Stable Diffusion的训练数据集以英文数据为主,没有大量包含其他语言文本的…...
vue-cli创建项目时由esLint校验导致报错或警告的问题及解决
vue-cli创建项目时由esLint校验导致报错或警告的问题及解决 一、万能办法 一、万能办法 //就是在报错的JS文件中第一行写上 /* eslint-disable */链接: https://www.yii666.com/blog/288808.html 其它的方法我遇见了再补充...
uniapp:实现手机端APP登录强制更新,从本地服务器下载新的apk更新,并使用WebSocket,实时强制在线用户更新
实现登录即更新,或实时监听更新 本文介绍的是在App打开启动的时候调用更新,点击下方链接,查看使用WebSocket实现实时通知在线用户更新。 uniapp:全局消息是推送,实现app在线更新,WebSocket,ap…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
