Spring来了,春天还会远吗?

结束了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.mfbz.cn/a/320798.html

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

相关文章

Android 通知

通知 通知是指 Android 在应用界面之外显示的消息&#xff0c;旨在向用户提供提醒、来自他人的通信或应用中的其他实时信息。用户可以点按通知以打开您的应用&#xff0c;或直接从通知中执行操作。 通知在状态栏中显示为图标&#xff0c;在抽屉式通知栏中显示更详细的条目&…

【书生·浦语】大模型实战营——第五课作业

教程文档&#xff1a;https://github.com/InternLM/tutorial/blob/vansin-patch-4/lmdeploy/lmdeploy.md#tritonserver-%E6%9C%8D%E5%8A%A1%E4%BD%9C%E4%B8%BA%E5%90%8E%E7%AB%AF 视频链接&#xff1a; 作业&#xff1a; 基础作业 使用如下命令创建conda环境 conda create…

【期末考试】数据库综合复习宝典

目录 第一章 数据库系统概述 第二章 关系代数 第四章 关系数据库理论 第五章 数据库设计 第六章 数据库管理系统 第八章 事务管理 第一章 数据库系统概述 1.1三级模式 ①外模式&#xff1a;它为特定的应用程序或用户群体提供了一个数据视图&#xff0c;这个视图是独立于…

评估LLM在细胞数据上的实用性(2)-细胞层面的评估

本文衔接上一篇&#xff1a;评估LLM在细胞数据上的实用性(1)-基本概述 目录 定义参数和任务批次整合多模态整合细胞类型注释 细胞层面的评估批次整合多模态整合细胞类型注释 定义 我们考虑一个预训练LLM表示为 M ( x , θ ) M(x,\theta) M(x,θ)&#xff0c;其基于单细胞数据…

设计模式-传输对象模式

设计模式专栏 模式介绍模式特点应用场景传输对象模式和序列化的区别代码示例Java实现传输对象模式Python实现传输对象模式 传输对象模式在spring中的应用 模式介绍 传输对象模式&#xff08;Transfer Object Pattern&#xff09;是一种设计模式&#xff0c;用于从客户端向服务…

【redis基础1】基础数据类型详解和应用案例

博客计划 &#xff0c;我们从redis开始&#xff0c;主要是因为这一块内容的重要性不亚于数据库&#xff0c;但是很多人往往对redis的问题感到陌生&#xff0c;所以我们先来研究一下。 本篇&#xff0c;我们先看一下redis的基础数据类型详解和应用案例。 1.redis概述 以mysql为…

某mps政务网站jsl加速乐cookie逆向解析

本文针对的目标网站如下&#xff0c;使用base64解密获得 aHR0cHM6Ly93d3cubXBzLmdvdi5jbi8 开篇&#xff1a;加速乐其实算是比较好处理的逆向问题了&#xff0c;了解过的朋友都知道&#xff0c;其本身跟瑞数相似&#xff0c;都是设置cookie后才能成功&#xff0c;设置cookie的过…

配置CentOS系统以支持静态HTTP服务

CentOS是一个流行的Linux发行版&#xff0c;广泛应用于服务器环境。要配置CentOS系统以支持静态HTTP服务&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Web服务器软件&#xff1a;CentOS自带了Apache HTTP服务器软件&#xff0c;您可以使用以下命令安装它&#xff1…

计算机找不到vcomp140.dll怎样修复?马上教会你修复dll问题

在计算机系统运行过程中&#xff0c;遭遇“vcomp140.dll丢失”的场景并不少见&#xff0c;这一问题的出现往往伴随着软件无法正常启动、运行时错误提示或者系统性能下降等现象。具体场景可能包括但不限于&#xff1a;用户在尝试打开某个依赖于Visual C Redistributable库的应用…

机器学习入门知识

一、引言 机器学习是当前信息技术中最令人振奋的领域之一。在这门课程中&#xff0c;我们将探索该技术的前沿&#xff0c;并能够亲自实现机器学习的算法。 或许你每天都在不知不觉中使用了机器学习的算法。每次你打开谷歌或必应搜索你需要的内容&#xff0c;正是因为它们拥有出…

FFmpeg技术详解

FFmpeg技术详解 本文概不介绍相关安装配置&#xff0c;详情请入官方或者其他大佬博客&#xff0c;此处做出推荐&#xff1a; https://ffmpeg.org/ FFmpeg官网 https://ffmpeg.github.net.cn/developer.html FFmpeg中文文档 https://blog.csdn.net/m0_47449768/article/details/…

以太网抓包软件Wireshake应用介绍( SMART PLC MODBUSTCP通信)

首先介绍下常看到的字符ACK,ACK是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符,表示发来的数据已确认接收无误。在TCP/IP协议中,如果接收方成功的接收到数据,会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接收方回复给发送方。ACK在TCP的…

Github Copilot最全的安装与使用教程:一款非常好用的AI编程工具

Github Copilot最全的安装与使用教程 第一章 安装1.安装 GitHub Copilot2.获取资格第二章 使用1.产生建议1.1 键入你想要完成的操作的注释1.2 CtrlI 2. 接受建议3.查看下一个建议3.接受部分建议4.在新选项卡接受建议5.完成多项功能6.聊天 GitHub Copilot 供经过验证的学生、教师…

AI绘画风格化实战

在社交软件和短视频平台上&#xff0c;我们时常能看到各种特色鲜明的视觉效果&#xff0c;比如卡通化的图片和中国风的视频剪辑。这些有趣的风格化效果其实都是图像风格化技术的应用成果。 风格化效果举例 MidLibrary 这个网站提供了不同的图像风格&#xff0c;每一种都带有鲜…

【前端性能优化】如何取消http请求

文章目录 需要取消http请求的3种经典场景原生XMLHttpRequest取消http请求fetch取消http请求axios取消http请求哪些情况需要取消HTTP请求取消http请求能带来哪些性能提升 需要取消http请求的3种经典场景 场景一&#xff1a;有一个实时搜索功能&#xff0c;每当用户输入内容改变的…

构建中国人自己的私人GPT-有道GPT

创作不易&#xff0c;请大家多鼓励支持。 在现实生活中&#xff0c;很多人的资料是不愿意公布在互联网上的&#xff0c;但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢&#xff1f;于是我们构建自己或公司的私人GPT变得非常重要。 先看效果 一、…

训练AI模型:寻找最优参数a和b

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

基于面向对象,C++实现双链表

双链表同单链表类似&#xff0c;由一个值和两个指针组成 Node.h节点头文件 #pragma once class Node { public:int value;Node* prev;Node* next;Node(int value);~Node(); };Node.cpp节点源文件 #include "Node.h"Node::Node(int value) {this->value value…

深度学习笔记(六)——网络优化(2):参数更新优化器SGD、SGDM、AdaGrad、RMSProp、Adam

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解&#xff0c;如有遗漏或错误&#xff0c;欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 在前面的博文中已经学习了构建神经网络的基础需求&#xff0c;搭建了一个简单的双层网络结构来实现数据的分…

【设计模式】什么场景可以考虑使用简单工厂模式

1.概述 工厂模式是一种创建型模式&#xff0c;主要作用就是创建对象&#xff0c;将对象的创建过程和使用的过程进行解耦。我们平时说的工厂模式实际上是对三种不同类型的工厂模式的统称&#xff0c;简单工厂、工厂方法、抽象工厂&#xff0c;而在23种设计模式中&#xff0c;只…