【Spring】之基础概念和使用

news2024/12/23 20:18:57

🏀🏀🏀来都来了,不妨点个关注!
🎧🎧🎧博客主页:欢迎各位大佬!
在这里插入图片描述

文章目录

  • 1. Spring的概述
    • 1.1 什么是容器?
    • 1.2 什么是IoC?
    • 1.3 什么是DI?
    • 1.4 理解Spring IoC
  • 2. Spring的创建和使用
    • 2.1 前置准备
    • 2.2 存储Bean对象
      • 2.2.1创建Bean对象
      • 2.2.2 将Bean注入到Spring
    • 2.3 获取并使用Bean对象
      • 2.3.1 创建一个Spring上下文对象
        • 2.3.1.1 ApplicationContext和BeanFactory有什么区别
      • 2.3.2 获取Bean对象
      • 2.3.3 使用Bean对象

1. Spring的概述

我们常说的Spring是指Spring Framework(Spring 框架),它是一个开源的框架,它有着广泛的应用场景,它可以让Java企业级开发更加简单。
用一句话总结就是:Spring是一个包含了众多工具方法的IoC容器。

1.1 什么是容器?

通俗来说,容器就是用来存放东西的,就比如我们的杯子平常就是用来装水的,这里的杯子就是一个容器。回想我们之前学过哪些容器呢?

  • List/Map ->数据存储容器
  • Tomcat ->Web容器

而我们说的Spring则是对象存储的容器,它里面则是存储的对象。

1.2 什么是IoC?

上面,我们提到Spring是一个IoC容器,这里的IoC是指Inversion Of Control,翻译过来就是 “控制反转” 的意思。也就是说Spring是一个“控制反转”的容器,那这里的控制是指的对谁的控制呢?
正如我们上面提到过Spring是存储对象的容器,其“控制反转”指的就是对对象的控制权的反转。
对象的生命周期,不由程序员(或当前代码片段)控制,而是由Spring(Spring容器/IoC容器)控制——控制反转

1.3 什么是DI?

提到IOC我们就不得不提到DI(Denpendcy Injection)——依赖注入。
依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中。依赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引⼊ IoC 容器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。
IOC是一种设计思想,而DI是一种具体的实现方式。
就比如今天小丁学习很累,想去吃顿好的犒劳下自己,那吃顿好的这个想法这就是设计思想,而具体是去吃烤肉还是火锅这个行为则是具体的实现方式。

1.4 理解Spring IoC

在文章最开始我们就说了:Spring是一个IoC容器。那么如何理解这句话呢?
既然Spring是一个IoC(控制反转)容器,那么重点还在“容器”上,是一个容器就应该具体以下特点:

  • 将对象存储到容器中
  • 把对象从容器中取出来
    这也就是说,学Spring的核心功能就包括了,学如何将对象存入到Spring中,再从Spring中取出对象的过程。

将对象存放到容器中的好处:将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。⽽ new 对象的⽅式相当于,每次需要⼯具了,才现做,⽤完就扔掉了也不会保存,下次再⽤的时候还得重新做,这就是 IoC 容器和普通程序开发的区别。

2. Spring的创建和使用

通过上述的说明,我们知道学习Spring就是要学如何将对象存入到Spring中,再从Spring中取出对象的过程,那么接下来我们就来创建一个Spring项目进行对象的存入和取出操作。Spring项目的创建分为以下几步:

  1. 创建一个maven项目
  2. 添加Spring相关依赖
  3. 添加一个启动类
    这里我们不做过多赘述。

2.1 前置准备

当我们创建好一个maven项目后,在pom.xml中导入以下依赖就变成了一个Spring项目:

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
    </dependencies>

在这里插入图片描述
然后在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"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com.java.demo"></content:component-scan>

</beans>

在上面我们也提到了学Spring的核心功能包括了,学如何将对象存入到Spring中,再从Spring中取出对象的过程。接下来我们就对如何将对象存入到Spring以及如何从Spring中将对象取出作讲解。(在Spring框架中,我们将存储在Spring容器中的对象称为“Bean”)。

2.2 存储Bean对象

存储Bean对象分为两步:

  1. 创建一个Bean对象,所谓的Bean其实就是Java的一个普通类。
  2. 将Bean注入到Spring容器。

2.2.1创建Bean对象

public class User {
    public void sayHi() {
        System.out.println("Hi,User~");
    }
}

2.2.2 将Bean注入到Spring

在前置准备中,我们已经配置好了spring-config.xml这个文件,我们只需按照以下格式将Bean写入文件即可。

<bean id="user" class="com.java.demo.User"></bean>

此处的id就是我们之后通过Spring容器拿到这个Bean对象的名称,而class则是这个Bean所在目录的路径。

2.3 获取并使用Bean对象

获取并使用Bean对象分为以下三步:

  1. 获取Spring上下文对象
  2. 通过Spring上下文获取指定Bean对象
  3. 使用Bean对象

2.3.1 创建一个Spring上下文对象

下面的讲解中我们均以获取User对象为例,User定义如下:

package com.java.demo;

import com.java.demo.model.ArticleInfo;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

@Service
public class User {

    public User() {
        System.out.println("User Init");
    }
    public void sayHi() {
        System.out.println("Hi,User~");
    }
}

  //1.得到上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

在这里插入图片描述
另一种创建Spring上下文对象的方式:通过BeanFactory获取

BeanFactory context2 = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
2.3.1.1 ApplicationContext和BeanFactory有什么区别

首先,从功能上来看,ApplicationContext是BeanFactory的子接口,因此它继承了BeanFactory的所有功能。但除此之外,ApplicationContext还扩展了更多的功能,如支持国际化、资源文件访问等,这使得它提供了更完整的框架功能。

其次,从加载和创建Bean的方式来看**,BeanFactory采用的是延时加载的方式**,也就是说,在容器启动时并不会立即创建所有的Bean,而是在需要使用某个Bean的时候,才会对其进行加载和实例化。这种方式的好处是在应用启动的时候占用资源较少,对于资源要求较高的应用可能更具优势。而ApplicationContext则是在容器启动的时候,一次性创建所有的Bean,这样在系统启动的时候就能尽早地发现配置问题,并且在运行时速度相对BeanFactory会更快。

最后,从创建方式来看,BeanFactory通常是以编程的方式创建的,而ApplicationContext则是以声明的方式创建的,通常是自动注册的。

综上所述,ApplicationContext和BeanFactory在功能、加载和创建Bean的方式以及创建方式上都有所不同。在实际应用中,可以根据具体需求选择使用哪一个。如果需要更丰富的框架功能和更快的运行速度,那么ApplicationContext可能是一个更好的选择;而如果资源要求较高,或者希望更精细地控制Bean的加载和创建过程,那么BeanFactory可能更适合。

2.3.2 获取Bean对象

  • 根据名称获取Bean对象
User user = (User)context.getBean("user");

在这里插入图片描述
另外两种获取Bean对象的方法:

  • 根据类型获取Bean
User user = (User)context.getBean(User.class);

可能的问题:当同一个类型注入Spring中多个的情况,使用类型获取Bean就会发生报错:
在这里插入图片描述

在这里插入图片描述
解决方法:使用名称获取Bean或者使用名称+类型获取Bean。

  • 根据名称+类型获取Bean
User user = (User)context.getBean("user",User.class);

2.3.3 使用Bean对象

     user.sayHi();

在这里插入图片描述
整体的获取Bean对象代码如下:


import com.java.demo.User;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class App {
    public static void main(String[] args) {
        //1.得到上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//        BeanFactory context2 = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        //2.得到bean对象
        // 通过名称获取
          User user = (User) context.getBean("user");
        //通过类型获取
//            User user = context.getBean(User.class);
        //通过名称+类型获取
//        User user = context.getBean("user", User.class);

        //3.使用bean对象
         user.sayHi();
    }
}

好了,今天的分享就到这里结束了,感谢支持!

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

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

相关文章

(二十八)Flask之wtforms库【上手使用篇】

目录&#xff1a; 每篇前言&#xff1a;用户登录验证&#xff1a;用户注册验证&#xff1a;使用示例&#xff1a; 抽象解读使用wtforms编写的类&#xff1a;简单谈一嘴&#xff1a;开始抽象&#xff1a; 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【…

多任务学习,在共享层,究竟在共享什么?

在多任务学习中&#xff0c;共享层所共享的主要是网络结构和参数。具体来说&#xff0c;当多个任务在共享层进行参数硬共享时&#xff0c;它们使用的是相同的网络结构&#xff08;例如三层全连接神经网络&#xff09;&#xff0c;并且这些网络层的权重&#xff08;weights&…

Java工具类:批量发送邮件(带附件)

​ 不好用请移至评论区揍我 原创代码,请勿转载,谢谢! 一、介绍 用于给用户发送特定的邮件内容,支持附件、批量发送邮箱账号必须要开启 SMTP 服务(具体见下文教程)本文邮箱设置示例以”网易邮箱“为例,其他如qq邮箱或企业邮箱均可,只要在设置中对应开启SMTP及授权码等操…

css中设置元素大小的属性block-size

block-size 是 CSS 中的一个属性&#xff0c;它用于设置元素的块级尺寸&#xff08;即元素的高度&#xff09;。这个属性是 height 和 max-height 的逻辑组合&#xff0c;允许你同时设置元素的最小和最大高度。 这些属性旨在让布局不再依赖于传统的物理方向&#xff08;如上下左…

爬虫 | 基于 Python 实现有道翻译工具

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在利用 Python 语言实现一个简单的有道翻译工具。有道翻译是一款常用的在线翻译服务&#xff0c;能够实现多种语言的互译&#xff0c;提供高质量的翻译结果。 目录 一、项目功能 二、注意事项 三、代码解析 1. 导入…

eclipse配置SVN和Maven插件

3、 安装SVN插件 使用如下方法安装 Help–Install New Software 注意&#xff1a;目前只能安装1.8.x这个版本的SVN&#xff0c;如果使用高版本的SVN&#xff0c;在安装SVN和maven整合插件的时候就会报错&#xff0c;这应该是插件的bug。 点击Add name: subclipse location…

隐式/动态游标的创建与使用

目录 将 emp 数据表中部门 10 的员工工资增加 100 元&#xff0c;然后使用隐式游标的 %ROWCOUNT 属性输出涉及的员工数量 动态游标的定义 声明游标变量 打开游标变量 检索游标变量 关闭游标变量 定义动态游标&#xff0c;输出 emp 中部门 10 的所有员工的工号和姓名 Orac…

编程入门(四)【计算机网络基础(由一根网线连接两个电脑开始)】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言两个电脑如何互连呢&#xff1f;集线器、交换机与路由器总结 前言 当你有…

【IC前端虚拟项目】接口分析与agent组件生成

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 到目前为止关于环境的准备工作都已经完成了,甚至验证环境的大体结构我们也已经画好了,再来看一下: 于是乎呢就可以大张旗鼓的开始咱们验证环境的搭建了!看上面这个结构图,里面除了mvu作为DUT,其他…

【C语言】冒泡排序算法详解

目录 一、算法原理二、算法分析时间复杂度空间复杂度稳定性 三、C语言实现四、Python实现 冒泡排序&#xff08;Bubble Sort&#xff09;是一种基础的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。遍历数列…

HackMyVM-BaseME

目录 信息收集 arp nmap WEB web信息收集 gobuster hydra 目录检索 ssh 提权 get user sudo base64提权 get root 信息收集 arp ┌─[rootparrot]─[~/HackMyVM] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, IPv4: 192.168…

机器人的非接触式充电和无线充电有什么区别?

文 | BFT机器人 在日新月异的技术浪潮中&#xff0c;接触式与非接触式无线充电之间的微妙差异变得愈发重要&#xff0c;这如同在纷繁复杂的迷雾中增添了一层难以捉摸的迷离。而今&#xff0c;一些所谓的“无线”充电站纷纷涌入市场&#xff0c;它们自诩为无需线缆束缚的新时代…

在线预约家政服务小程序上门服务源码系统 带完整的安装代码包以及搭建教程

随着互联网的快速发展&#xff0c;家政服务行业也逐渐向线上化、智能化转型。为了满足广大用户的需求&#xff0c;罗峰给大家分享一款在线预约家政服务小程序上门服务源码系统。该系统不仅功能完善&#xff0c;而且操作简单&#xff0c;是您打造高效、便捷的家政服务平台的首选…

【uniapp踩坑记】——微信小程序转发保存图片

关于微信小程序转发&保存图片 微信小程序图片转发保存简单说明网络图片的转发保存base64流形式图片转发保存 已经好多年没写博客了&#xff0c;最近使用在用uniapp开发一个移动版管理后台&#xff0c;记录下自己踩过的一些坑 吃相别太难看&#xff0c;搞一堆下头僵尸号来点…

Elasticsearch Windows上安装

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能…

python二级题目-仅使用 Python 基本语法,即不使用任何模块,编写 Python 程序计算下列数学表达式的结果并输出,小数点后保留 3 位。

x(((3**4)5*(6**7))/8)**0.5 .format 用法一&#xff1a; print({}.format(1)) 1 print(这个是format的用法{}。。。.format(3)) 这个是format的用法3 ’大括号1:{},大括号2:{},大括号3:{}‘.format(3,4,5) print(’大括号1:{},大括号2:{},大括号3:{}‘.form…

github,raw.githubusercontent.com 等网址登陆不上不去的设置方法

目录 提示域名解析错误&#xff1a; 出现的现象&#xff1a; 解决办法&#xff1a;修改host host改完不生效 解决方案1&#xff1a; 解决方案2&#xff1a; 提示域名解析错误&#xff1a; 出现的现象&#xff1a; 登陆github&#xff0c;raw.githubusercontent.com 等网…

Vue接收接口返回的mp3格式数据并支持在页面播放音频

一、背景简介 在实际工作中需要开发一个转音频工具&#xff0c;并且能够在平台页面点击播放按钮播放音频 二、相关知识介绍 2.1 JS内置对象Blob Blob对象通常用于处理大量的二进制数据&#xff0c;可以读取/写入/操作文件、音视频等二进制数据流。Blob表示了一段不可变的二…

第21天:信息打点-公众号服务Github监控供应链网盘泄漏证书图标邮箱资产

第二十一天 一、开发泄漏-Github监控 1.短期查看 1.密码搜索 根据攻击目标的域名在GitHub上进行搜索密码&#xff0c;如果目标网站的文件与搜索到的源码相关&#xff0c;那就可以联想目标网站是否使用这套源码进行开发 原理就是开发者在上传文件的时候忘记更改敏感文件或者…

Arduino源代码(ino)在Proteus中调试总结

一、前言 基于BluePill Plus开发板&#xff08;该板是毕设网红板&#xff09; BluePill Plus / WeAct Studio 微行工作室 出品 BluePill-Plus/README-zh.md at master WeActStudio/BluePill-Plus GitHub 首页-WeAct Studio-淘宝网 (taobao.com) 在Proteus中对应的例子是&…