Spring 快速入门案例

2023-11-09

Spring框架参考文档

什么是Spring?

  Spring是一个轻量级的开源框架,它是为简化企业级应用开发而生,使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能。

Spring有哪些优点?

  • 方便解耦, 简化开发

Spring是个大工厂,可以将所有对象创建以及对象间依赖关系的维护,交给Spring容器进行管理,避免硬编码造成过度的程序耦合,实现程序各层之间的解耦。

  • AOP编程的支持

Spring提供面向切面编程(将日志记录、权限控制、性能统计等服务理解成一个切面),可以将日志、权限等服务从业务逻辑中分离出来,可以方便的实现对程序进行权限拦截、运行监控等功能。

  • 声明式事务支持

Spring只需通过配置就可以完成对事务的管理,无需手动编程,大大提高了开发的效率。

  • 方便集成各种优秀框架

Spring不排斥各种优秀开源框架,其内部提供了对各种优秀框架(如 : Struts、Hibernate、MyBatis等. . .)的直接支持。

  • 方便程序的测试

Spring对Junit4支持,可以通过注解的方式来测试Spring程序

  • 降低JavaEE API的使用难度

Spring对JavaEE开发中一些非常难用的API(JDBC、JavaMail、远程调用等. . .)都提供了封装,使这些API的使用难度大大降低。

Spring的核心:控制反转IoC 和 依赖注入DI 的概念?

 IoC(Inverse of Control)反转控制,就是将原本在程序中手动创建类对象的控制权,交由Spring框架管理。

 DI(Dependency Injection)依赖注入,就是在Spring创建某个对象的过程中,将这个对象所依赖的属性(变量或其它类对象)注入进去。

控制反转(IoC)

控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(DI)

Spring核心是一个IoC容器(管理Bean),而IoC的关键就是BeanFactory工厂,它会代替我们创建bean,然后使用getBean来获取,而不是自己去new,就是工厂模式的体现。而这个工厂之所以能够创建这个bean,就是因为它读取了我们传入的配置文件,根据配置信息利用反射创建了对应类的实例。

IoC的实现可以看做是反射+配置文件+工厂。反射和工厂是Spring内部帮我们封装实现好的。我们只需要使用配置文件进行配置即可

Spring IOC快速入门案例流程:

下载Spring所需基本jar包

复制Spring开发jar包到项目工程中

编写Spring核心配置文件spring.xml

在程序中读取Spring 配置文件,通过Spring框架获得Bean,完成相应的操作

在上面是我们的开发流程,我们第一步一般都是导入所需jar包,但由于刚开始时根本不知道该在什么时候用到哪些jar包,所以这里事先不导入jar包,而是在开发过程中,报错提示缺少哪些jar时,在依次导入
 

File --→ New --→ Project
CD4356

选择Spring ,然后再 Libraries 下选择set up library later

Use library : 如果你已下载好了jar包,可选择该项,然后点击Create . .选择导入所需的jar
Download :如果你没有下载好所需jar,可选择该选项下载Spring所需的部分jar,并且它还会自动给你创建一个applicationContext.xml配置文件
set up library later :如果你想在创建好项目后在自己手动导入jar,那么可以选择该选项

编辑项目名称,并选择项目所在路径
CD4356

创建好的项目结构如下
CD4356


在 src 下创建com.CD4356.ioc包,在包中创建Student
CD4356

public class Student {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "我叫:"+this.name+",今年:"+this.age+"岁了...";
    }
}

src → New → XML Configuration File → Spring config 创建Spring的配置文件

不对啊,为什么没有Spring config选项,是不是出什么问题了

原来Spring config是依赖于spring-beans-4.3.22.RELEASE.jar产生的,而我们还没有导入该jar包,所以找不到Spring config选项

CD4356

 在SpringIoCDemo项目下,新建lib文件夹,然后到maven中央仓库中下载spring-beans-4.3.22.RELEASE.jar导入lib文件夹中,选择Add as Library 将jar包放在classpath路径下
在这里插入图片描述

 

继续 src → New → XML Configuration File → Spring config 创建Spring的xml配置文件,文件名为applicationContext(文件名可任意)
发现导入spring-beans-4.3.22.RELEASE.jar后,可以找到Spring config选项了

CD4356

 创建好的applicationContext.xml文件如下所示,这些内容是自动生成的,我们还没有开始编辑该文件
CD4356

编辑applicationContext.xml配置文件,内容如下
CD4356 

在src下创建一个测试类,名为SpringApplication

然后在编写加载XML配置文件代码时报错了,那么这是个什么错误呢?

因为ApplicationContext类位于spring-context-4.3.22.RELEASE.jar包中,而我们的项目中还没有带入该jar包,所以这里需要我们导入该jar包

CD4356

解决ApplicationContext报红后,ClassPathXmlApplicationContext又报红了

spring-beans-4.3.22.RELEASE.jar外部依赖spring-core-4.3.22.RELEASE.jar,没有导入spring-core-4.3.22.RELEASE.jar包,无法找到xml配置文件

所以导入spring-core-4.3.22.RELEASE.jar后可解决文题
CD4356

 ok,完成下面代码后,点击main函数左边的绿色三角标运行项目

CD4356

哈哈!又报错了

缺少commons-logging-1.2.jar包,以后如果遇到java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory,一般都是缺少jar包导致的( 当然也可能是找不到自定义类 )

复制org.apache.commons.logging mvn到百度中(mvn即maven仓库),进入maven仓库中找,下载导入项目中
CD4356

又报错了

缺少spring-expression-4.3.22.RELEASE.jar

百度org.springframework.expression mvn,下载spring-expression-4.3.22.RELEASE.jar

CD4356

 终于运行成功了

CD4356

 

【由上面的内容可以看出,实现一个简单的Spring IoC示例至少需要用到5个jar(4个核心jar + 1个第三方日志jar)包】

spring-context-4.3.18.RELEASE.jar
spring-beans-4.3.18.RELEASE.jar
spring-core-4.3.18.RELEASE.jar
spring-expression-4.3.18.RELEASE.jar
commons-logging-1.2.jar

【Spring配置文件】

Spring配置文件是用于指导Spring工厂进行Bean生产、依赖关系注入(装配)及Bean实例分发的图纸。

容器默认到类路径下加载Spring配置文件,如果配置文件放在src的下一级目录下,则需要在ClassPathXmlApplicationContext(String configLocation)中指定src下的存放路径

/**
 * 在src目录下,新建一个spring包来存放applicationContext.xml
 */
ApplicationContext context=new 
ClassPathXmlApplicationContext("spring/applicationContext.xml");

在一些大型项目中,会有多个配置文件,我们可以在ClassPathXmlApplicationContext()方法中同时加载多个Spring配置文件

ApplicationContext context=new 
ClassPathXmlApplicationContext(new String[]{"spring/applicationContext.xml",
"spring/spring-config.xml",...,"spring/spring-config5.xml"});

其中ApplicationContext.xml是Spring的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。
【Spring配置文件中的<bean>标签】

一个用来描述一个对象,id是唯一标识(根据id识别具体的Bean),class表示该类的具体java文件(全类名)

因为spring IoC是一个容器,我们在Spring配置文件中添加对类的描述

在我们加载IOC容器后,Spring就会全自动的为我们创建相应的对象

此时我们就无需再自己new创建对象了,而是直接通过getBean("bean标签中id的属性值")获取即可

这就是所谓的控制反转,将创建对象的权限反转给Spring IoC容器,对类之间的关系进行了解耦,而这一切都离不开Spring配置文件中使用的标签

所以Spring IoC容器会帮我们做两件事:1. 创建对象  2. 为属性赋值
CD4356

【Bean工厂的ApplicationContext】

Spring IoC设计的核心是Bean容器

BeanFactory采用了java经典的工厂模式,通过从xml配置文件中读取javaBean的定义,来实现javaBean的创建、配置和管理bean与bean之间的依赖关系,所以BeanFactory可以称为IoC容器。

ApplicationContext的中文含义是: 应用上下文,继承自BeanFactory接口,它除了包含BeanFactory的所有功能之外,还在国际化支持、资源访问(如URL和文件)、事件传播等方面进行了良好的支持,使之成为Java EE应用放中首选的IoC容器,可应用于Java APP和Java Web中。

CD4356

BeanFactory 和 ApplicationContext 的不同之处

BeanFactory容器实例化后并不会自动实例化bean,只有当bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配
ApplicationContext容器实例化后会自动对所有的单实例bean进行实例化与依赖关系的装配,使之处于待用状态

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 快速入门案例 的相关文章

  • 如何将 Java 赋值表达式转换为 Kotlin

    java中的一些东西就像 int a 1 b 2 c 1 if a b c System out print true 现在它应该转换为 kotlin 就像 var a Int 1 var b Int 2 var c Int 1 if a
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • 【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)

    目录 一 链表基本概念和基本代码实现 二 链表 动态数组整合 面向接口编程 三 clear 四 add int index E element 1 找到 index 位置的节点 2 get int index 和 set int index
  • 前端入坑(四)--------react(如何从API获取数据)

    Hey Welcome to day 4 Hopefully you ve had time to follow along and do the exercises from the last few days And if I ve d
  • GIT : 记录IntelliJ IDEA 合并冲突时的一个bug(冲突解决后代码和本地仓库一样时导致merge失败)

    目录 目录 IntelliJ IDEA版本 问题描述 解决办法 IntelliJ IDEA版本 IntelliJ IDEA 2017 1 4 x64 问题描述 我们在用git开发是经常遇到冲突的情况 一般发生在协同开发时 一个文件被两个人同
  • Unity-Transform.eulerAngles

    Description The rotation as Euler angles in degrees The x y and z angles represent a rotation z degrees around the z axi
  • ReactJS之属性和状态的对比

    1 都是纯JS对象 2 都会触发render的执行 3 都有确定性 状态 state 是由组件本身进行维护和修改的 组件外部是无法进行修改的 属性 props 组件自身具有的特性 是无法被自身修改的 但是父组件是可以修改子组件的属性 子组件
  • 贝叶斯网络是神经网络吗,贝叶斯网络和神经网络

    深度信念网络与深度贝叶斯网络有什么区别 1 贝叶斯网络是 一种概率网络 它是基于概率推理的图形化网络 而贝叶斯公式则是这个概率网络的基础 贝叶斯网络是基于概率推理的数学模型 所谓概率推理就是通过一些变量的信息来获取其他的概率信息的过程 基于
  • 内网穿透NPS及NPC搭建(使用docker实现)

    客户端及服务端下载 NPS 1 启动NPS服务器容器 端口映射需要注意 docker run td rm p 10180 8080 p 10124 8024 p 10150 10179 10150 10179 name nps q01231
  • 遥感NDVI估算植被覆盖度

    遥感NDVI估算植被覆盖度 植被覆盖度是指植被 包括叶 茎 枝 在地面的垂直投影面积占统计区总面积的百分比 容易与植被覆盖度混淆的概念是植被盖度 植被盖度是指植被冠层或叶面在地面的垂直投影面积占植被区总面积的比例 两个概念主要区别就是分母不
  • php+redis实现对200w用户的即时推送服务

    欢迎加入 新群号码 99640845 怎么实现对200w用户的即时推送 这个推送可以理解为调用第三方的接口 push sms之类的东西 当时先写了一个demo 直接读取DB然后单个推送 结果 可想而知 于是设计一套基于redis php多进
  • EfficientNet的解读与Tensorflow 2.0实现

    EfficientNet论文解读 Efficient Net是Google在2019年发表的一篇论文 系统的研究了如何在给定资源的条件下 如何平衡扩展网络的深度 广度以及图像的分辨率这三者的关系 来取得最好的图像识别精度 作者提出了一种新的
  • part1:推荐一些适合练手、课程设计、毕业设计的python小项目源码,无任何下载门槛

    人生苦短 我用python 随着python这些年的流行 很多人开始使用python来实现各种功能 下面推荐一些适合用来练手 大学生课程设计作业 大学生毕业设计的python小项目 尤其适合新手 源码 说明文档 打包后的exe文件 都已经被
  • MCP2515独立控制器

    1 简介 MCP2515 是一款独立控制器局域网络 Controller Area Network CAN 协议控制器 完全支持 CAN V2 0B 技术规范 该器件能发送和接收标准和扩展数据帧以及远程帧 MCP2515 自带的两个验收屏蔽
  • GPU pytorch 1.4.0 cuda 10.1 安装

    安装版本 pytorch 1 4 0 torchvision 0 5 0 cudatoolkit 10 1 pytorch官网 第一步 安装 conda 镜像通道 conda config add channels https mirror
  • QT5开发

    摘要 Qt5主窗口是大部分Qt应用使用的基本界面 常见应用都会通过对主窗口进行界面布局来实现 一 QT5主窗口构成 1 基本元素 QMainWindow是一个为用户提供主窗口程序的类 包含一个菜单栏 menubar 多个工具栏 tool b
  • SpringMvc学习-2-Spring MVC 的核心组件

    Spring MVC 的核心组件 DispatcherServlet 核心处理器 也叫前端控制器 负责调度其他组件的执行 可降低不同组件之间的耦合性 是整个 Spring MVC 的核心模块 Handler 处理器 完成具体业务逻辑 相当于
  • Java 8: 从永久代(PermGen)到元空间(Metaspace)

    正如大家所知 JDK 8 Early Access版已经提供下载 这使开发者可以体验Java8的新特性 其中之一 是Oracle从JDK7发布以来就一直宣称的要完全移除永久代空间 例如 字符串内部池 已经在JDK7中从永久代中移除 JDK8
  • STM32题目项目汇总 - 100例

    文章目录 1前言 2 STM32 毕设课题 3 如何选题 3 1 不要给自己挖坑 3 2 难度把控 3 3 如何命名题目 1前言 更新单片机嵌入式选题后 不少学弟学妹催学长更新STM32和C51选题系列 感谢大家的认可 来啦 以下是学长亲手
  • 一点小记录

    看到一篇介绍vue plugin pages 很好的文章 懒癌福利 一种全新的路由组织方式 基于 vite 的插件介绍 他还有个github地址 try vite plugins 这里截图记录一下
  • Arm Linux 内存管理(一)————开启MMU

    首先我们根据vmlinux lds可以找到内核入口函数为 stext 我们就直接从stext开始 主要干了几件事情 1 safe svcmode maskall r9 设置CPU运行模式为SVC 并关中断 2 bl vet atags 验证
  • Spring 快速入门案例

    Spring框架参考文档 什么是Spring Spring是一个轻量级的开源框架 它是为简化企业级应用开发而生 使用Spring可以使简单的JavaBean实现以前只有EJB才能实现的功能 Spring有哪些优点 方便解耦 简化开发 Spr