《精通Spring4.x 企业应用开发实战》第1章 Spring概述
目录标题
- 前言
- 一、Spring带给我们什么
- 二、Spring体系结构
- 三、Spring4.0新特性
- 核心容器的增强
- 泛型依赖注入
- Map依赖注入
- @Lazy延迟依赖注入
- List注入
- @Conditional 注解
- CGLIB 代理类增强
- 其他
- 四、Spring 子项目
- 总结
前言
汇总:《精通Spring4.x 企业应用开发实战》
一、Spring带给我们什么
- 方便解耦,简化开发。通过 Spring 提供的
IoC 容器,用户可以将对象之间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度程序耦合。有了 Spring, 用户不必再为单实例模式类、属性文件解析等这些底层的需求编写代码,可以更专注于上层的应用。 AOP 编程的支持。通过 Spring 提供的 AOP 功能,方便进行面向切面的编程,很多不容易用传统OOP实现的功能可以通过 AOP 轻松应对。声明式事务的支持。在 Spring 中,用户可以从单调烦闷的事务管理代码中解脱出来,通过声明的方式灵活地进行事务管理,提高开发效率和质量。- 方便程序的测试。可以用非容器依赖的编程方式进行几乎所有的测试工作。在Spring 里,测试不再是昂贵的操作,而是随手可做的事情。
- 方便集成各种优秀框架。Spring 不排斥各种优秀的开源框架,相反,Spring 可以降低各种框架的使用难度。Spring 提供了对各种优秀框架(如 Struts、Hibernate、 Hessian、 Quartz 等)的直接支持。
- 降低 Java EE API 的使用难度。Spring 对很多难用的 Java EE API(如JDBC、JavaMail、远程调用等)提供了一个薄层封装,通过 Spring 的简易封装,这些Java EE API 的使用难度大大降低。
- Java 源码是经典的学习范例。Spring 的源码设计精妙、结构清晰、匠心独运,处处体现着
大师对 Java 设计模式的灵活运用及对 Java 技术的高深造诣。Spring框架源码无疑是 Java 技术的最佳实践范例。如果想在短时间内迅速提高自己的 Java 技术水平和应用开发水平,学习和研究 Spring 源码将会收到意想不到的效果。
二、Spring体系结构
Spring 核心框架由 4000 多个类组成,整个框架按其所属功能可以划分为5个主要模块,如图1-1所示:

从整体来看,这5个主要模块几乎为企业应用提供了所需的一切,从持久层、业务层到展现层都拥有相应的支持。就像吕布的赤免马和方天画戟、秦琼的黄骠马和熟铜锏,IoC 和 AOP 是 Spring 所依赖的根本。在此基础上,Spring 整合了各种企业应用开源框架和许多优秀的第三方类库,成为 Java 企业应用 full-stack 的开发框架。
1、 loC
Spring 核心模块实现了 loC 的功能,它将类与类之间的依赖从代码中脱离出来,用配置的方式进行依赖关系描述,由 IoC 容器负责依赖类之间的创建、拼接、管理、获取等工作。BeanFactory 接口是 Spring 框架的核心接口,它实现了容器许多核心的功能。
Context 模块构建于核心模块之上,扩展了 BeanFactory 的功能,添加了 il18n 国际化、Bean 生命周期控制、框架事件体系、资源加载透明化等多项功能。此外,该模块还提供了许多企业级服务的支持,如邮件服务、任务调度、JNDI 获取、EJB 集成、远程访问等。ApplicationContext 是 Context 模块的核心接口。
表达式语言模块是统一表达式语言(Unified EL) 的一个扩展,该表达式语言用于查询和管理运行期的对象,支持设置/获取对象属性,调用对象方法,操作数组、集合等。此外,该模块还提供了逻辑表达式运算、变量定义等功能,可以方便地通过表达式串和Spring IoC 容器进行交互。
2、 AOP
AOP 是继 O0P之后,对编程设计思想影响极大的技术之一。AOP 是进行横切逻辑编程的思想,它开拓了考虑问题的思路。在 AOP 模块里,Spring提供了满足 AOP Alliance规范的实现,还整合了 AspectJ 这种 AOP 语言级的框架。在 Spring 里实现 AOP 编程有众多选择。Java 5.0 引入 java.lang.instrument,允许在JVM 启动时启用一个代理类,通过该代理类在运行期修改类的字节码,改变一个类的功能,从而实现 AOP 的功能。
3、数据访问和集成
任何应用程序的核心问题是对数据的访问和操作。数据有多种表现形式,如数据表、XML、消息等,而每种数据形式又拥有不同的数据访问技术(如数据表的访问既可以直接通过 JDBC,也可以通过 Hibernate 或 MyBatis)。
首先,Spring 站在 DAO 的抽象层面,建立了一套面向 DAO层的统一的异常体系,同时将各种访问数据的检查型异常转换为非检查型异常,为整合各种持久层框架提供基础。其次,Spring 通过模板化技术对各种数据访问技术进行了薄层封裝,将模式化的代码隐藏起来,使数据访问的程序得到大幅简化。这样,Spring 就建立起了和数据形式及访问技术无关的统一的 DAO 层,借助 AOP 技术,Spring提供了声明式事务的功能。
4、 Web 及远程操作
该模块建立在 Application Context模块之上,提供了 Web 应用的各种工具类,如通过 Listener 或 Servlet 初始化 Spring 容器,将 Spring 容器注册到 Web 容器中。该模块还提供了多项面向 Web 的功能,如透明化文件上传、Velocity、FreeMarker、XSLT 的支持。此外,Spring 可以整合 Struts、 WebWork 等 MVC框架。
5、Web 及远程访问
Spring 自己提供了一个完整的类似于 Struts 的 MVC框架,称为 Spring MvC, 据说Spring 之所以也提供了一个 MVC 框架,是因为 Rod Johnson 想证明实现 MVC 其实是一项简单的工作。当然,如果你不希望使用 Spring MVC,那么 Spring 对 Struts、 Web Work等MVC 框架的整合,一定也可以给你带来方便。相对于 Servlet 的 MVC, Spring 在简化 Portlet 的开发上也做了很多工作,开发者可以从中受益。
6、WebSocket
WebSocket 提供了一个在 Web 应用中高效、双向的通信,需要考虑到客户端(浏览器)和服务器之间的高频和低时延消息交换。一般的应用场景有在线交易、游戏、协作、数据可视化等。此外,Spring 在远程访问及 Web Service 上提供了对很多著名框架的整合。由于Spring 框架的扩展性,特别是随着 Spring 框架影响性的扩大,越来越多的框架主动支持Spring 框架,使得 Spring 框架应用的涵盖面越来越宽广。
三、Spring4.0新特性
核心容器的增强
Spring 4.0 对核心容器进行了增强:
- 支持泛型依赖注入;
- 对 GgLib 类代理不再要求必须有空参构造器(这个特性带来很大便利);
- 在基于 Java 的配置里添加了 @Description;
- 提供@Conditional 注解来实现 Bean 的条件过滤;
- 提供@Lazy 注解解决 Bean延时依赖注入;
- 支持 Bean 被注入 List或者 Array 时可以通过@Order 注解或基于 Ordered 接口进行排序。
- 如果使用 Spring 的注解支持,则可以使用自定义注解来组合多个注解,方便对外公开特定的属性。
泛型依赖注入
Spring 4.0可以为子类的成员变量注入泛型类型:

Map依赖注入

上述写法将 BaseService 类型注入map 中。其中,k名字;value 是所有实现了 BaseService 的 Bean。
@Lazy延迟依赖注入

List注入


@Conditional 注解
@Conditional 类似于@Profile,一般用于在多个环境(开发环境、测试环境、正式机环境)中进行配置切换,即通过某个配置来开启某个环境。@Conditional 注解的优点是允许自己定义规则。可以指定在如@Component、@Bean、 @Configuration 等注解的类上,以决定是否创建 Bean 等。
CGLIB 代理类增强
在 Spring 4.0 中,基于 CGLIB的代理类不再要求类必须有空参构造器,这是一个很好的特性。使用构造器注入有很多好处,比如,可以确保只在创建 Bean 时注入依赖,以保证 Bean 不可更改;又如,如果对UserService 类进行事务增强,此时要求 UserService 类必须有空参构造器,就会造成很多不便。
其他
Spring4.0其他特性:
- Spring Web MVC的增强:新增了@RestController注解;
- 支持了WebSocket;
- 全面支持Java8;
- …
四、Spring 子项目
打开 Spring 官方网站 http://spring.io/projects,可以看到 Spring 众多的子项目,它们构建起一个丰富的企业级应用解决方案的生态系统。
在这个生态系统中,除 Spring 框架本身外,还有很多值得关注的子项目。从配置到安全,从普通 Web 应用到大数据,用户在构建应用基础设施的时候,总能从 Spring 子项目中找到一个适合自己的子项目。对Spring 应用开发者来说,了解这些子项目,可以更好地使用 Spring;也可以通过阅读这些子项目的源代码,更深入地了解 Spring 的设计架构和实现原理。
下面以表格形式对Spring 的各个子项目进行简要介绍,如表1-1 所示:


总结
待补充。
相关文章:
《精通Spring4.x 企业应用开发实战》第1章 Spring概述
目录标题前言一、Spring带给我们什么二、Spring体系结构三、Spring4.0新特性核心容器的增强泛型依赖注入Map依赖注入Lazy延迟依赖注入List注入Conditional 注解CGLIB 代理类增强其他四、Spring 子项目总结前言 汇总:《精通Spring4.x 企业应用开发实战》 一、Spring带…...
【Spring Cloud Alibaba】003-Nacos 概述与单机搭建
【Spring Cloud Alibaba】003-Nacos 概述与单机搭建 文章目录【Spring Cloud Alibaba】003-Nacos 概述与单机搭建一、Nacos 概述0、新技术学习思路推荐1、什么是 Nacos2、架构图架构图架构图信息二、Nacos 单机搭建1、下载与启动下载地址编辑 startup.cmd 文件下面对两种模式的…...
如何使用 API 工具做 Websocket 测试
在 API 测试中,对 Websocket 协议的支持呼声越来越高,今天给大家推荐一款 开源的 API 管理工具——Postcat,以及教教大家,如何利用 API 管理工具做 Websocket 测试。 在线 Demo 链接:Postcat - Open Source API Ecosys…...
90%的人都理解错了HTTP中GET与POST的区别
Get和Post是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别就是Get把参数包含在URL中,Post通过request body传递参数。 你可能自己写过无数个Get和Post请求,或者已经看过很多权威网站总结…...
【C++】秋招实习面经汇总篇
C面经汇总 系列综述: 目的:本系列是个人整理为了秋招和实习面试的,整理期间苛求每个知识点,平衡背诵量与深入程度。 来源:材料主要源于阿秀的笔记和《王道考研复习指导》进行的,每个知识点的修正和深入主要…...
干货分享:2023欧美市场分析与机会
1、2023年欧美市场分析美国是⼀个消费大国,正常情况下做外贸不可忽略的市场。如何找客户:专注产业链 。产业链对接,其上游是什么,那么他就是我的客户 ( 原材料-⼯⼚)南美洲是北美的经济殖民地(矿产资源农产品),非洲仍然…...
介绍Kadence Elements元素模板:按您的方式设计网站
随着 Kadence Pro 1.0.4 和 Kadence Blocks Pro 1.5.8 的发布,Kadence 团队很高兴地宣布推出最强大的新方法,帮助网站所有者使用 Kadence Elements Templates 创建动态和高度定制的 WordPress 网站。如果您曾经创建过 WordPress 网站,并且发现…...
物联网发展的重要通信技术Wi-Fi
Wi-Fi 可以适应各种场景的联网需求 Wi-Fi 在实现物联网创新方面发挥了基础性作用,提供了广泛的连接性,将各种“事物”相互连接、连接到互联网,以及连接到全球使用的 180 亿台 Wi-Fi 设备。物联网的经济潜力是无限的,Wi-Fi 为智能…...
OSS上传(Java和Js)
OSS上传(Java和Js)准备工作创建RAM用户创建角色创建权限策略给角色授予权限策略获取临时访问凭证Java普通上传OSSJava分片上传OSSJS普通上传OSSJS分片上传OSS使用RAM用户或STS方式访问 由于阿里云账号AccessKey拥有所有API访问权限,建议遵循阿…...
【虚拟机】VirtualBox Host-Only + 主机网络共享配置
文章目录创建Host-Only虚拟机配置主机配置其它工作中经常会使用到虚拟机进行各种技术的试验,之前为了省事常用桥接模式,可是我经常变换办公地点,每个办公地点的局域网网段并不一样,所以我采取了仅主机模式网络共享这种方式&#x…...
小公司“混”的3年,我认真做了5件事,真的受益终生
小公司“混”的3年,我认真做了5件事,真的受益终生 目录:导读 功能测试很重要但不值钱 自动化测试在小公司没市场,但是你得会 给自己的一些忠告 第一件事:分清阶段,制定计划 第二件事:梳理…...
Linux Crontab命令定时任务基本语法与操作教程
Linux Crontab命令定时任务基本语法与操作教程 一、Crontab查看编辑重启 1、查看crontab定时执行任务列表 crontab -l 2、编辑crontab定时执行任务 crontab -e 3、删除crontab定时任务 crontab -r 4、相关命令: sudo service crond start #启动服务 sudo …...
文档测试要测什么,如何进行测试?
文档测试要测什么,如何进行测试? 对于交付用户文档来说,以需求、用户手册、安装手册等为主,检查用户文档是否和实际的存在差别,主要从以下几个方面来考虑: 阅读者:文档面向的读者定位要清晰&…...
.net 6 引入EFCore
这里默认使用sql server数据库 DBFirst nuget引入程序集 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Design Microsoft.EntityFrameworkCore.Tools Microsoft.Extensions.Logging.Console 执行脚本 设置DAL…...
MySQL------自定义排序
1、MySQL函数 field() 实现自定义 语法: SELECT * from table_name ORDER BY FIELD(str,str1,str2,str3,…) str: 字段名, str1,str2,str3: 自定义排序的数值 例1排序-所有值: 先姓名排序后出生日期排序 SELECT * from name_info ORDER BY FIELD(name…...
FFMPEG自学二 ⾳频编码实战
一、FFmpeg编码流程二、流程关键函数avcodec_find_encoder:根据指定的AVCodecID查找注册的编码器。 avcodec_alloc_context3:为AVCodecContext分配内存。 avcodec_open2:打开编码器。 avcodec_send_frame:将AVFrame⾮压缩数据给…...
一致魔芋在北交所上市:市值突破11亿元,吴平夫妇为实控人
2月21日,湖北一致魔芋生物科技股份有限公司(下称“一致魔芋”,BJ:839273)在北京证券交易所上市。本次上市,一致魔芋的发行价为11.38元/股,发行1350万股,募资总额约为1.54亿元。 本次发行后&…...
进程或线程终止是否会释放锁
线程锁的必要性比如一个多线程抢票程序,tickets作为临界资源,所有的线程都要对它进行判断ticket是否大于0,以及ticket–的操作。用ticket–操作举例,虽然他看起来是一行C语言的代码,但是实际上它的底层汇编经历了三个阶…...
mysql复制表提示某些为null字段无效
sql_mode‘ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’ explicit_defaults_for_timestamp ON 1、方式1、 首先用下面的命令看下sql_mode show variables like ‘sql_mode’; 如果查询的结果如下&#…...
【数据库】redis 配置文件与发布订阅
目录 配置文件 一,Units 二, INCLUDE 三,NETWORK 1, bind 2, tcp-backlog 3,timeout 4, tcp-keepalive 四,GENERAL 1,daemonize 2, pidfile 3&…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
