Java学习 - Spring 讲解

前言

为了解决我们开发者在 J2EE 开发时所遇到的众多问题,Rob Johnson 等人发起了 Spring 框架项目。Spring 是一个开源的 J2EE 应用程序框架,是针对 Bean 的生命周期进行管理的轻量级容器。它既可以单独用于构建程序,也能和当前众多的 Web 框架进行组合使用,能够十分方便的降低当前企业应用开发的复杂性。既然 Spring 如此强大,那我们今天就来探究一下 Spring 的内容。

Spring 概览

Spring 其实是一个很大的范围概称,包含着许多分支,在正式了解 Spring 之前,我们先来看看 Spring 家族中的主要分支。

Spring FrameWok

Spring 领域中其他一切的基础,提供了 核心容器和依赖注入框架,还提供了一些基本数据持久性支持,特别是基于模板的 JDBC 文件。

Spring Boot

Spring Boot 不仅提供了 启动依赖和自动配置,还提供了如下的其他特性:

  1. Actuator 提供了对应用程序内部工作方式的运行时监控,包括端点、线程 dump 信息、应用程序健康状况和应用程序可用的环境属性。

  2. 灵活的环境属性规范。

  3. 核心框架的辅助测试之外的额外测试支持。

Spring Data

将应用程序的数据存储库抽象为简单的 Java 接口,同时当定义方法用于驱动数据进行存储和检索的问题时,对方法使用了命名约定。此外还能处理几种不同类型的数据库,包括包括关系型(JPA)、文档型(Mongo)、图型(Neo4j)等。

Spring Security

Spring Security 解决了广泛的应用程序安全性需求,包括身份验证、授权和 API 安全性等一系列工作。

Spring Integration 和 Spring Batch

Spring Integration 解决了实时集成,即数据在可用时进行处理。相反,Spring Batch 解决了批量集成的问题,允许在一段时间内收集数据,直到某个触发器(可能是一个时间触发器)发出信号,表示该处理一批数据。

Spring Cloud

Spring Cloud 是一组用 Spring 开发云本地应用程序的项目。

Spring 是为了减少 EJB 的复杂性而创建的一套解决方案,而 EJB 过于臃肿,使用 Spring 能够让 Java Bean 之间进行有效的解耦。而且 Spring 不仅仅局限于服务端的开发,在测试性和松耦合方面均有较好表现。

什么是 Spring

Spring 简介

我们日常所说的 Spring,实际上指的是 Spring Framework,属于 Spring 家族的一个分支。

Spring 的核心是一个 容器,常称为 Spring 应用程序上下文,用于创建和管理应用程序组件。组件(或 Bean)在 Spring 应用程序上下文中连接在一起互相构成一个完整的应用程序。

那么是如何将各种 Bean 连接在一起呢?这就是 Spring 中最重要的特性之一:依赖注入(DI)

依赖注入(DI):通过依赖注入的应用程序 不是 由组件自身创建和维护其所依赖的其他 Bean 的生命周期,而是依赖于单独的实体(容器)来创建和维护所有组件,并将这些组件注入需要他们的 Bean,通常是通过构造函数或属性访问器方法来完成

Spring 的特点

  • 方便解耦,简化开发过程;

  • 支持面向切面编程(Aop),方便我们不用修改源码就能对功能进行增强;

  • 整合支持 Junit,方便程序的测试;

  • 既可以独立构建程序,也支持各种框架,而且大大降低各种框架使用难度;

  • 支持事务管理,方便进行事物操作;

  • 降低了各种 API 的开发难度;

Spring 的组成

在这里插入图片描述

Spring 是一个分层架构,主要由如下 7 大模块所构成。Spring 模块位于核心容器,定义了创建、配置和管理 Bean 的方式。

  1. Spring Core:提供 Spring 框架基本功能,主要组件是 BeanFactory,是工厂模式的实现,通过 IOC 机制将应用程序的配置和依赖性规范与实际的应用程序代码分开。

  2. Spring Context:一个配置文件,给 Spring 框架提供上下文信息,上下文包括 JNDI、EJB、电子邮件、国际化、校验和调度等企业服务。

  3. Spring AOP :通过配置管理特性,Spring AOP 直接将 AOP(面向切面)功能集成到 Spring 框架。从而我们能够十分方便的使用 Spring 框架来管理任何支持 AOP 的对象。模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用该组件,可以不依赖其他组件九江声明性事务管理集成到应用程序中。

  4. Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可以用来管理异常处理和不同数据库供应商抛出的错误信息。异常层次结构简化了错误处理,而且极大降低了需要编写的异常代码数量。Spring DAO 面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

  5. Spring ORM:Spring 框架中插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map,这些都遵从 Spring 的通用事务和 DAO 异常层次结构;

  6. Spring Web:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文,所以 Spring 框架支持与 Jakarta Structs 的集成。同时该模块还简化了处理多部分请求以及请求参数绑定到域对象的工作。

  7. Spring Web MVC:MVC 是一个全功能的构建 Web 应用的 MVC 实现,可以通过策略接口对 MVC 框架实现高度可配置。而且 MVC 还容纳了 JSP、Velocity、Tiles 等视图技术。

在这里插入图片描述

XML 配置 VS Java 配置

对于之前的版本,Spring 容器将各个组件连接起来的方式是通过 XML 配置,但现在的版本中更多的是使用基于 Java 的配置,如下面基于 XML 的配置等效于基于 Java 的配置。

  • 基于 XML 配置
<bean id="productService" calss="com.cunyu.ProductService"></bean>
<bean id="consumerService" class="com.cunyu.ConsumerService">
	<constructor-arg ref="productService" />
</bean>
  • 基于 Java 配置
@Configuration
public class ServiceConfig{
    @Bean
    public ProductService productService(){
        return new ProductService();
    }
    
    @Bean
    public ConsumerService consumerService(){
        return new ConsumerService(productService());
    }
}

在基于 Java 的配置中,@Configuration 向 Spring 表明该类是一个配置类,为 Spring 应用程序上下文提供 Bean。而 @Bean 注解则指示类方法返回的对象应作为 Beans 添加到应用程序上下文中。

那你可能想,既然之前有了 XML 配置的方式,那么为什么后来的版本中又加入了基于 Java 的配置方式呢?基于 Java 的配置方式相比于 XML 的配置方式,包含了更高的类型安全性和更高的可重构性。而且仅当 Spring 无法自动配置组件时,才需要通过 XML的配置方式 或者 基于 Java 的配置方式 来进行显式配置。

自动配置自动装配 + 组件扫描。有赖于 组件扫描,Spring 能 自动从应用程序的类路径中发现组件,同时将其创建为 Spring 应用程序上下文中的 Bean。而通过 自动装配,Spring 将自动将组件与其所依赖的其他 Bean 一起注入

最近随着 Spring Boot 的推出,自动配置的优势进一步加强,在这种配置中,Spring Boot 将根据 类路径中的条目、环境变量和其他因素,合理猜测所需配置的组件,将其连接在一起。Spring Boot 中的自动配置大大减少了构建应用程序所需的显式配置的数量,增强了 Spring 开发的能力。

初始化 Spring 应用程序

项目结构

对于一个 Spring 项目而言,其结构主要包括以下部分:

  1. src/main/java:该目录主要包含应用程序的源码,主要可分为如下几类:
    • build :工程启动类;
    • entity :实体类;
    • mapper :数据访问层;
    • service :数据服务层,业务类代码;
    • controller :前端访问控制器;
    • config :配置信息类;
    • dto:数据传输层;
    • utils :工具类;
    • constant :常用接口类;
    • vo :数据传输类;
    • Application.java:项目的启动类;
  1. src/main/resources:相关资源文件;

  2. src/test/java:测试相关代码;

  3. src/test/resources:测试相关资源;

  4. pom.xml:Maven 构建规范,包含一些项目及依赖方面的配置。

项目启动类

项目启动类,即运行 jar 文件时用来引导应用程序执行的类,也就是项目结构中的 Application.java,下面是一个项目启动类的实例:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TacoCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(TacoCloudApplication.class, args);
    }
}

其中 @SpringBootApplication 注解说明该类是一个 Spring 引导应用程序,但实际上它是组合了下列三个注解的复合应用注解:

  • @SpringBootConfiguration指定该类为配置类

  • @EnableAutoConfiguration启用 Spring 自动配置

  • @ComponentScan启用组件扫描。允许声明其他带有 @Component@Controller@Service 等注解的类,以便让Spring 自动发现他们并将他们注册为 Spring 应用程序上下文中的组件。

总结

OK,总结一下今天的内容,主要讲了:

  1. Spring 家族成员的内容;

  2. Spring 的概念

  3. Spring 的特点

  4. Spring 的组成

  5. 配置 Spring 的两种方式

  6. 一个 Spring 项目常见的项目结构

好了,以上就是今天的所有内容了。原创不易,如果你觉得我的内容对你有所帮助,那就帮忙点赞关注吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/798854.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《昇思25天学习打卡营第18天|基于MobileNetv2的垃圾分类》

MobileNetV2是一种轻量级的深度神经网络&#xff0c;设计用于移动和嵌入式设备。它的核心思想是通过深度可分离卷积&#xff08;Depthwise Separable Convolutions&#xff09;和倒残差结构&#xff08;Inverted Residuals&#xff09;来减少计算复杂度和模型参数量。其主要特点…

什么叫图像的双边滤波,并附利用OpenCV和MATLB实现双边滤波的代码

双边滤波&#xff08;Bilateral Filtering&#xff09;是一种在图像处理中常用的非线性滤波技术&#xff0c;主要用于去噪和保边。它在空间域和像素值域上同时进行加权&#xff0c;既考虑了像素之间的空间距离&#xff0c;也考虑了像素值之间的相似度&#xff0c;从而能够有效地…

WPF学习(4) -- 数据模板

一、DataTemplate 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;DataTemplate 用于定义数据的可视化呈现方式。它允许你自定义如何展示数据对象&#xff0c;从而实现更灵活和丰富的用户界面。DataTemplate 通常用于控件&#xff08;如ListBox、…

[GXYCTF2019]BabySQli

原题目描述&#xff1a;刚学完sqli&#xff0c;我才知道万能口令这么危险&#xff0c;还好我进行了防护&#xff0c;还用md5哈希了密码&#xff01; 我看到是个黑盒先想着搞一份源码 我dirsearch明明扫到了.git&#xff0c;算了直接注入试试看 随便输入了两个东西&#xff0c…

赛氪网荣获2024年中国高校计算机教育大会合作伙伴荣誉

2024年7月13日&#xff0c;在黑龙江哈尔滨召开的“2024年中国高校计算机教育大会&#xff08;CCEC2024&#xff09;”&#xff0c;环球赛乐&#xff08;北京&#xff09;科技有限公司(以下简称”赛氪网“)凭借其在高等教育与科技创新领域的卓越贡献&#xff0c;荣幸地获得了本次…

安卓onNewIntent 什么时候执行

一.详细介绍 onNewIntent 方法 onNewIntent 是 Android 中 Activity 生命周期的一部分。它在特定情况下被调用&#xff0c;主要用于处理新的 Intent&#xff0c;而不是创建新的 Activity 实例。详细介绍如下&#xff1a; 使用场景 singleTop 启动模式&#xff1a; 如果一个 Ac…

6.S081的Lab学习——Lab11: Network

文章目录 前言Network提示&#xff1a;实现e1000_transmit的一些提示&#xff1a;实现e1000_recv的一些提示&#xff1a; 解析 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0c;将它的Lab逐一实现&#xff0c;并记录期间心酸历程。 代码下…

python如何结束程序运行

方法1&#xff1a;采用sys.exit(0)&#xff0c;正常终止程序&#xff0c;从图中可以看到&#xff0c;程序终止后shell运行不受影响。 方法2&#xff1a;采用os._exit(0)关闭整个shell&#xff0c;从图中看到&#xff0c;调用sys._exit(0)后整个shell都重启了&#xff08;RESTAR…

【接口自动化_13课_接口自动化总结】

一、自我介绍 二、项目介绍 自己的职责、项目流程 1&#xff09;功能测试&#xff0c;怎么设计用例的--测试策略 2&#xff09;功能测试为什么还有代码实现&#xff0c;能用工具实现&#xff0c;为什么还用代码实现。 基本情况 项目名称:项目类型&#xff1a;项目测试人员…

文本分类--NLP-AI(八)

文本分类任务 任务简介1.字符数值化方式1方式2 2.池化&#xff08;pooling&#xff09;3.全连接层4.归一化函数&#xff08;Sigmoid&#xff09;5.总结 从任务抽象新的技术点Embedding层池化层 任务简介 任务介绍&#xff1a; 字符串分类&#xff0c;根据一句话的含妈量&#…

2024最新Cloudways主机使用教程(含最新Cloudways折扣码)

Cloudways是一家提供云托管服务的公司&#xff0c;可以帮助你轻松管理和运行你的网站。本教程是Cloudways主机注册和使用教程。Cloudways界面简洁&#xff0c;使用方便&#xff0c;不需要复杂的设置&#xff0c;就能快速搭建一个WordPress网站。它的主机功能包括高级缓存和Bree…

GEO数据挖掘从数据下载处理质控到差异分析全流程分析步骤指南

综合的教学视频介绍 GEO数据库挖掘分析作图全流程每晚11点在线教学直播录屏回放视频&#xff1a; https://www.bilibili.com/video/BV1rm42157CT/ GEO数据从下载到各种挖掘分析全流程详解&#xff1a; https://www.bilibili.com/video/BV1nm42157ii/ 一篇今年近期发表的转…

[misc]-流量包-wireshark-icmp

wireshark打开&#xff0c;大部分都是icmp,查看data部分 提取data长度&#xff1a; tshark.exe -r 1.pcapng -T fields -e data.len > length.txt 使用python解析这个文件&#xff0c;剔除异常值&#xff0c;每8个取一个值&#xff0c;得到flag ds [] with open(length.tx…

Pytorch张量

在conda的环境中安装Jupyter及其他软件包 Pytorch 建立在张量&#xff08;tensor&#xff09;之上&#xff0c;Pytorch张量是一个 n 维数组&#xff0c;类似于 NumPy 数组。专门针对GPU设计&#xff0c;可以运行在GPU上以加快计算效率。换句话说&#xff0c;Pytorch张量是可以运…

重要特性——链接

链接允许你创建对文件或目录的引用&#xff0c;而不必复制其内容。 1.硬链接&#xff1a;硬链接是指向同一文件系统的同一个inode&#xff08;索引节点&#xff09;的多个文件名。这意味着每个硬链接实际上是同一个文件的不同名字。改变文件内容将影响所有硬链接&#xff0c;因…

机器学习——决策树(笔记)

目录 一、认识决策树 1. 介绍 2. 决策树生成过程 二、sklearn中的决策树 1. tree.DecisionTreeClassifier&#xff08;分类树&#xff09; &#xff08;1&#xff09;模型基本参数 &#xff08;2&#xff09;模型属性 &#xff08;3&#xff09;接口 2. tree.Decision…

创维汽车与深圳市互充充签订战略合作协议,首批订单100辆超充车型!

2024年6月19日&#xff0c;创维汽车与深圳互充充网络科技有限公司于创维汽车徐州基地签订战略合作协议。此次合作旨在通过技术创新和资源整合&#xff0c;在汽车销售、融资租赁、绿色低碳等领域深化合作&#xff0c;拓展合作业务&#xff0c;创新合作模式&#xff0c;共同推动新…

常用控件(六)

布局管理器 布局管理器垂直布局QHBoxLayoutQGridLayoutQFormLayoutQSpacerItem 布局管理器 之前使⽤ Qt 在界⾯上创建的控件, 都是通过 “绝对定位” 的⽅式来设定的. 也就是每个控件所在的位置, 都需要计算坐标, 最终通过 setGeometry 或者 move ⽅式摆放过去.这种设定⽅式其…

麒麟系统开发笔记(十四):在国产麒麟系统上编译libmodbus库、搭建基础开发环境和移植测试Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140387947 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【爱上C++】vector模拟实现

文章目录 前言一&#xff1a;基本框架1.结构的定义2.构造函数①.详解 const T& val T()②.为什么要多加一个int类的带参构造&#xff1f;】 3.析构函数4.size()和capacity()5.push_back尾插6.operator[]operator[]的返回类型为T&有以下几个原因&#xff1a; 二&#x…