Spring来了,春天还会远吗?

news2025/2/24 11:00:47

结束了JVM的学习后,要进入的是JavaEE进阶的学习了。JavaEE进阶学习内容很多很丰富,并且也很有难度。今天我们就从Spring开始讲起。

目录

框架的好处

怎么学框架

Spring核心与设计思想

容器

IoC

Spring IoC

DI(Dependency Injection)

Spring的创建和使用

创建Maven项目

创建Bean

1.配置文件

2.创建Bean

3.将Bean注册到容器

4.获取并且使用Bean对象

4.1 获取到Spring的上下文

4.2 获取指定的Bean对象

4,3 使用Bean对象


在讲Spring之前,我们讲讲为什么要学习框架。

框架的好处

框架总结出来就是三点:易用、简单、高效。

之前学习的Servlet,就是一个框架。我们接下来要学习的SpringBoot也是一个框架。相比于Servlet,SpringBoot就要方便很多了。

Servlet痛点:

1. 添加外部 jar 不方便,容易出错,比如添加了⼀个不匹配的外部 jar 版本;

2. 运行和调试的时候需要配置 tomcat 不方便;

3. 发布不方便,servlet 项⽬必须依靠外置的 tomcat(外置的 web 容器)运行。

4. 路由配置不方便,⼀个访问地址对应⼀个 Servlet 类。 

这一些问题可能也不是什么大问题,但是某些方面是很影响效率的,一处不方便,处处不方便。

接下来我们学习的新知识就可以一步一步解决掉这一些痛点。

怎么学框架

  • 先从基础框架 Spring 开始(工具箱)
  • Spring Boot 快速开发 Spring 脚手架
  • MyBatis 快速操作数据库
  • 其他:日志、事务、拦截器...

Spring核心与设计思想

介绍完了框架,我们就从最基础的Spring讲起。

我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因。Spring ⽀持广泛的应用场景,它可以让 Java 企业级 的应用程序开发起来更简单。

用一句话来概括Spring:

Spring是包含了众多工具方法的IoC容器。

容器

容器,是用来容纳某种物体的。之前我们接触的容器有哪些?

List/Map:数据存储容器

Tomcat:Web容器

那么Spring也是一个容器,是一个IoC容器。

IoC

IoC,翻译过来就是“控制反转”。也就是说Spring是一个控制反转的容器。

传统程序:

我们现在要构造一辆车(Car Class),而车需要依赖车身(Framework Class),车身需要依赖底盘(Bottom Class),底盘需要依赖轮胎(Tire Class),最终实现的代码:

可以看到,通过方法的层层调用,最后才实现Tire中的结果。这样的坏处就是,代码之间高度耦合,如果需要修改底层代码,整个调用链上的代码都需要修改。

我们把调用汽车的程序示例改造⼀下,把创建子类的方式,改为注入传递的方式,具体实现代码如下:

代码经过以上调整,无论底层类如何变化,整个调用链是不用做任何改变的,这样就完成了代码之间的解耦。

在传统的代码中对象创建顺序是:

Car -> Framework -> Bottom -> Tire

改进之后解耦的代码的对象创建顺序是:

Tire -> Bottom -> Framework -> Car

我们发现了⼀个规律:通用程序的实现代码,类的创建顺序是反的,传统代码是 Car 控制并创建了 Framework,Framework 创建并创建了 Bottom,依次往下,从改进之后的控制权发生的反转,不再是上级对象创建并控制下级对象了,而是下级对象把注入将当前对象中,下级的控制权不再由上级类控制 了,这样即使下级类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。

Spring IoC

既然 Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”二字上,那么它就具备两个最基础的功 能:

  • 将对象存入到容器
  • 从容器中取出对象

也就是说,学Spring最核心的功能,就是如何将对象存到Spring中,并且再从Spring中取出来。

那么Spring是一个IoC容器,说的就是对象的创建和销毁都交给Spring来管理,同时Spring又具备了存储对象和获取对象的能力。

DI(Dependency Injection

DI,就是依赖注入。

是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引入 IoC 容 器,利用依赖关系注⼊的方式,实现对象之间的解耦。

IoC和DI之间的区别是什么呢?

IoC是一种思想,而DI是实现这种思想的具体方法。

Spring的创建和使用

创建Maven项目

Spring项目的创建用Maven的方式。当导入相关的包后,就说明有了Spring的依赖,也就可以使用Spring相关的操作了。

在IDEA的设置中(当前项目设置和新项目设置)都要修改相关的用户设置文件。

首先是因为Spring的仓库在国外,我们把相关的配置源改成阿里云或者网易云。这样下载依赖的时候就不会因为网络环境报错了。

   <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>        
      </mirror>

 在pom.xml中也需要添加相关的spring依赖。

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>

创建Bean

以前的对象我们是自己new出来的,现在的对象我们称为bean对象,让Spring来帮助我们生产bean对象。

1.配置文件

在resources中新建一个xml文件,作为spring的配置文件。

在配置文件中添加如下代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
</beans>

2.创建Bean

我们先在Student类中创建student对象。

package com.spring.demo;

public class Student {
    public void sayhi() {
        System.out.println("hi");
    }
}

3.将Bean注册到容器

假设我们需要一个student这样一个Bean对象,只需要把这个对象添加到配置文件中。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

       <bean id="student" class="com.spring.demo.Student"></bean>
    
</beans>

也就是最后一句代码。这代表着id为student,class为student所在类注册到bean中。

4.获取并且使用Bean对象

4.1 获取到Spring的上下文

Spring的上下文对象可使用ApplicationContext来获取:

ApplicationContext context = new ClassPathXmlApplicationContext("spring_config.xml");

其中最后需要保证配置文件的名称和之前创建的相同。通过ApplicationContext来获取到Spring上下文。

同时还可以使用BeanFactory来作为Spring的上下文:

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring_config.xml"));

ApplicationContext 和 BeanFactory 效果是⼀样的,ApplicationContext 属于 BeanFactory 的⼦ 类,它们的区别如下:

继承关系和功能方面来说:Spring 容器有两个顶级的接口:BeanFactory 和 ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能力,而ApplicationContext 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性, 还添加了对国际化支持、资源访问支持、以及事件传播等方面的⽀持。

从性能方面来说:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,而BeanFactory 是需要那个才去加载那个,因此更加轻量。

对于我们使用来说,ApplicationContext会在启动的时候把所有的Bean实例化,而BeanFactory是惰性加载,只有从容器中拿Bean的时候才会去实例化。

4.2 获取指定的Bean对象

ApplicationContext context = new ClassPathXmlApplicationContext("spring_config.xml");
Student student = (Student) context.getBean("student");
ApplicationContext context = new ClassPathXmlApplicationContext("spring_config.xml");
Student student = context.getBean("Student.class");
ApplicationContext context = new ClassPathXmlApplicationContext("spring_config.xml");
Student student = context.getBean("student",Student.class");

三种方式获取到Bean对象。

第一种,虽然是最简单最好理解的,但是需要强制类型转换(从Object转成Student),可能会出现某些bug,毕竟叫做强制类型转化,强制过来的终归有些不好。

第二种和第三种,区别在于:如果有一个类型被重复注册到xml中时,只能根据第三种获取。

4,3 使用Bean对象

直接使用对象的方法:

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring_config.xml");
        Student student = (Student) context.getBean("student");
        student.sayhi();
    }

关于这部分内容,我们下一篇文章再详细讲解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GAN生成对抗网络介绍

GAN简介 GAN 全称是Generative Adversarial Networks&#xff0c;即生成对抗网络。 “生成”表示它是一个生成模型&#xff0c;而“对抗”代表它的训练是处于一种对抗博弈状态中的。 一个可以自己创造数据的网络&#xff01; 判别模型与生成模型 判别模型&#xff08;Discr…

Uniapp软件库源码-全新带勋章等

测试环境&#xff1a;php7.1。ng1.2&#xff0c;MySQL 5.6 常见问题&#xff1a; 配置好登录后转圈圈&#xff0c;检查环境及伪静态以及后台创建好应用 上传图片不了&#xff0c;检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图&#xff0c;在前端uitl文件夹里面…

第9章-第2节-Java中的反射机制

1、概念&#xff1a; 反射机制&#xff1a;是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意属性和方法&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为 java…

记录汇川:H5U于Factory IO测试13

主程序&#xff1a; 子程序&#xff1a; IO映射 子程序&#xff1a; 辅助出料 子程序&#xff1a; 模式选择 子程序&#xff1a; 示教程序 子程序&#xff1a; 手动程序 子程序&#xff1a; 统计程序 子程序&#xff1a; 异常报警 子程序&#xff1a; 自动程序&#xff1a; F…

Linux前后端项目部署

目录 1.jdk&tomcat安装 配置并且测试jdk安装 修改tomcat 配置文件 登入tomcat 发布 安装mysql 导入sql数据 发布项目war包 redis安装 nginx安装 配置nginx域名映射 部署前端项目 centos 7的服务安装 安装jdk 安装tomcat 安装Mysql 安装redis 安装nginx 前后…

STM32的FMC独立管理和控制外部存储器

在STM32中&#xff0c;FMC&#xff08;Flexible Memory Controller&#xff09;是一个功能强大的外部存储器控制器&#xff0c;用于管理和控制外部存储器设备&#xff0c;如SRAM、SDRAM、NOR Flash等。FMC允许将多个存储器设备连接到微控制器&#xff0c;并通过不同的片选线进行…

蝉妈妈简单使用

蝉妈妈使用教程 热点视频 如何通过蝉妈妈分析数据 如何使用

Python超详细基础文件操作(详解版)

一、文件操作 1. 文件打开与关闭 1.1 打开文件 在Python中&#xff0c;你可以使用 open() 函数来打开文件。 以下是一个简单的例子&#xff1a; # 打开文件&#xff08;默认为只读模式&#xff09; file_path example.txt with open(file_path, r) as file:# 执行文件操作…

深入理解 Spark(四)Spark 内存管理模型

Spark 中的内存管理和资源管理模型 Executor 进程作为一个 JVM 进程&#xff0c;其内存管理建立在 JVM 的内存管理之上&#xff0c;整个大致包含两种方式&#xff1a;堆内内存和堆外内存。 一个 Executor 当中的所有 Task 是共享堆内内存的。一个 Work 中的多个 Executor 中的…

centos源码编译安装nginx1.25.3脚本

Nginx是常见的反向代理服务器&#xff0c;以为经常要安装&#xff0c;所以做了一个install-nginx.sh 脚本&#xff0c;一个命令安装nginx #!/bin/sh # https://nginx.org/ # 本脚本自动安装 nginxr 软件到/usr/local/nginx 路径 # 安装成功后执行/usr/local/nginx/sbin/nginx即…

Javascript——vue下载blob文档流

<el-table-column label"操作" fixed"right" width"150" showOverflowTooltip><template slot-scope"scope"><el-button type"text" v-has"stbsd-gjcx-down" class"edit-button" click&…

[NAND Flash 5.5] PLC NAND 虽来但远

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 前言 图片来源: 存储随笔 2022年8月份在美国FMS峰会上,Solidigm公司(前身为Intel NAND部门)展示了全球第一款基于PLC NAND研发的SSD。这也标志着,PLC…

第 12 章 多路查找树

文章目录 12.1 二叉树与B 树12.1.1 二叉树的问题分析12.1.2 多叉树12.1.3 B 树的基本介绍 12.2 2-3 树12.2.1 2-3 树是最简单的 B 树结构, 具有如下特点:12.2.2 2-3 树应用案例12.2.3 其它说明 12.3 B 树、B树和 B*树12.3.1 B 树的介绍12.3.2 B 树的介绍12.3.3 B树的介绍12.3.4…

FL studio破解版 V20.8.3 最新中文破解版

FL Studio是一款功能强大的水果音乐制作软件&#xff0c;为用户提供了一个全能的数字音频工作站&#xff0c;软件提供了编曲、剪辑、录音、混音等功能&#xff0c;满足用户的各种音乐制作需求。软件已经成功破解&#xff0c;全中文的软件界面&#xff0c;去除了试用时间限制&am…

vscode(visual studio code) 免密登陆服务器

1.生成密钥 首先&#xff0c;在本地&#xff0c;打开命令输入框&#xff1a; WinR–>弹出输入框&#xff0c;输入cmd,打开命令框。 然后&#xff0c;在命令框&#xff0c;输入 ssh-keygen -t rsa -C "love"按两次回车键&#xff0c;问你是否重写&#xff0c;选择…

【AUTOSAR】--01 AUTOSAR网络管理基础

AUTOSAR网络管理做了几个项目了&#xff0c;但发现还是有些理解不够深入的地方&#xff0c;最近趁着有个新项目也要做AUTOSAR网络管理&#xff0c;再从头梳理一下AUTOSAR网络管理&#xff0c;预计用2-3篇文章&#xff0c;把AUTOSAR网络重新梳理完成。 这是第一篇&#xff0c;主…

高效构建Java应用:Maven入门和进阶(二)

高效构建Java应用&#xff1a;Maven入门和进阶&#xff08;二&#xff09; 二.基于IDEA的Maven的工程创建2.1 梳理Maven工程GAVP属性2.2 Idea构建Maven JavaSE工程2.3 Idea构建Maven JavaEE工程2.4 Maven工程项目结构说明 二.基于IDEA的Maven的工程创建 2.1 梳理Maven工程GAVP…

H7303 无电感,线性恒流,低压差,大电流,车灯/台灯 9V 12V 24V 30V

线性恒流芯片是一种用于控制电流的电子元件&#xff0c;通常用于驱动LED等器件。它的工作原理是通过维持输出电流的恒定来保持被驱动器件的亮度或功率稳定。 具体来说&#xff0c;线性恒流芯片会监测输出电流并调整电压以保持恒定的电流流过被驱动器件。以下是其基本工作步骤&…

SAP SD-DN-MM 交货单相关物料凭证的视图的日期问题

眼下有个需求 获取交货单对应的物料凭证的过账日期BLDAT。 同步BW数据过去 新增一个数据库视图 但是实际使用时&#xff0c;有效部分仅本月&#xff0c;再选择条件里面要加上 MATdoc-bldat > sy-datum - sydatum6(2). 于是使用ST05 跟踪了一下&#xff0c;发现在DD28S…

电影《潜行》中说的蜜罐是什么(网络安全知识)

近期刘德华、彭于晏主演的电影《潜行》在网上掀起了轩然大波&#xff0c;电影中有提到网络蜜罐&#xff0c;这引起了很多观众的疑问&#xff0c;蜜罐到底是什么&#xff1f; 从字面意思上来看&#xff0c;蜜罐就是为黑客设下的诱饵。这是一种具有牺牲性质的计算机系统&#xff…