【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…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...