Spring知识:探索Java开发的全新世界

news2025/1/22 15:44:56

文章目录

  • 初识Spring
    • 什么是Spring框架
    • Spring核心设计思想
  • Spring的核心特性
    • 什么是IOC容器?---控制反转(IoC)
      • 容器的基本概念
      • 什么是IOC
    • Spring的另一个特性:DI
    • Spring特性:DL
  • Spring的主要模块
  • 创建Spring项目
    • 创建maven项目
    • 添加spring依赖
    • 创建启动类
  • 创建bean对象
    • 添加spring配置文件
    • 创建Bean对象
    • 注入bean对象
    • 读取Bean对象
    • 另一种获取bean的方法
      • ApplicationContext 和 BeanFactory 的区别
  • 总结
  • 结束语

初识Spring

什么是Spring框架

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

什么是Spring,通俗的理解,就是将很多工具和方法集合起来,打包成一个易于使用的工具(也称框架)

Spring核心设计思想

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

Spring的核心特性

什么是IOC容器?—控制反转(IoC)

容器的基本概念

容器是用来容纳某种物品的(基本)装置。 ——来⾃:百度百科

Java 中也有一些容器,比如 List,Map这些集合,是数据储存容器,Tomcat 是 Web 容器,同理 Spring 是就一个 IoC 容器,它包含了许多的工具和方法。

什么是IOC

IoC即Inversion of Control,控制反转。在传统的Java应用中,我们直接在对象内部通过new关键字来创建依赖的对象。

Spring的另一个特性:DI

在Spring中,对象的创建和绑定都由Spring框架来管理,我们只需要在配置文件中声明好对象及其依赖关系,Spring就会自动帮我们创建对象并注入依赖。这种方式也被称为依赖注入(DI)。

Spring特性:DL

DL,即Dependency Lookup,依赖查找,也是 IoC的一种实现。

依赖查找和依赖注入的区别在于,依赖注入是将依赖关系委托给容器,由容器来管理对象之间的依赖关系,容器外部是不关心这种依赖关系的,需要时由容器判断提供什么;而依赖查找是由对象自己来查找它所依赖的对象,容器只负责管理对象的生命周期,也就是说此时需要容器外部自己确定要容器提供哪种依赖关系;两者之间是主动和被动的区别。

Spring的主要模块

Spring框架包含了许多模块,每个模块都有其特定的功能。以下是一些主要的模块:

Spring Core:提供了IoC容器,以及对Bean的管理和配置。
Spring Context:基于Core模块,提供了上下文信息,以及对企业级特性的支持,如JNDI、EJB等。
Spring DAO:提供了JDBC的抽象层,以及对声明式事务的支持。
Spring ORM:提供了对ORM框架的支持,如Hibernate、MyBatis等。
Spring Web:提供了对Web开发的支持,如Spring MVC、WebSocket等。

创建Spring项目

创建maven项目

在idea中创建一个空的maven项目

添加spring依赖

在 Maven 项目中添加 Spring 的支持(spring-context, spring-beans)
在pom.xml中添加如下依赖

<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>

创建启动类

创建启动类与main方法,用来做简单的测试

在 java 目录创建类,实现main方法,这里的main方法即使启动类。

创建bean对象

添加spring配置文件

bean即是对象的意思,Spring的核心是IOC控制反转,即将对象的管理权限交给Spring来实现。
右键单机resources目录,新建一个spring-config.xml配置文件。(此处的文件名无要求,但是尽量规范化)
将如下代码配置到Spring-config.xml文件中

<?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>

创建Bean对象

创建Bean对象。
我们要注入一个user对象,先创建一个user类。

package com.tr.demo;

public class User{
    public void sayHi(String name) {
        System.out.println("Hello!" + name );
    }
}

注入bean对象

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

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

id代表的是自己给该对象起的名字,后续获取该对象时需要使用。class则是文件路径

读取Bean对象

想要从 Spring 中将Bean对象读取出来,先要得到 Spring 上下文对象,相当于得到了 Spring 容器。

再通过 spring 上下文对象提供的方法获取到需要使用的Bean对象,最后就能使用Bean对象了。

ApplicationContext,也称为控制反转(IoC)容器,是 Spring 框架的核心。

import com.tr.demo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class APP {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2. 获取 bean 对象,这里根据 id 获取
        User user = (User) context.getBean("user");
        // 3. 使用 bean 
        user.sayHi("张三");
    }
}

注意,此处的getbean返回的是Object对象,返回值需要强制类型转换

getBean方法中的参数即是刚刚在xml的bean标签中添加的id属性,并且Spring提供了该方法的重载。
我们可以在xml文件中添加多个bean,同时这些bean的id(xml文件中是id,Java中更喜欢叫name)或者class属性是可以相同的,也可以是同一个类。
所以用name区分bean有时候是不靠谱的,比如同一个班级可能会有重名的现象,这时候通过名字来确认bean是不靠谱的,需要更多其他的细节。
以下是getbean的一种重载方法,通过.class来获取bean

import com.tr.demo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class APP {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2. 获取 bean 对象,这里根据 id 获取
        User user = context.getBean(User.class);
        // 3. 使用 bean 
        user.sayHi("张三");
    }
}

当然,通过.class获取bean也是不靠谱的,因为可以添加多个相同的bean
值得注意的是,因为getbean传入了.class文件,则返回值不需要强制类型转换

所以,更推荐使用name+class的双重确认。相对于上面两种方法,能够更加容易得到自己想要的bean。

import com.tr.demo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class APP {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2. 获取 bean 对象,这里根据 id 获取
        User user = context.getBean("user",User.class);
        // 3. 使用 bean 
        user.sayHi("张三");
    }
}

另一种获取bean的方法

此外,也可以使用BeanFactory来获取bean

import com.tr.demo.Student;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class APP2 {
    public static void main(String[] args) {
        // 1. 得到 bean 工厂
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        // 2. 获取 bean 对象
        User user= (User) factory.getBean("user");
        // 3. 使用 bean
        user.sayHi("李四");
    }
}

ApplicationContext 和 BeanFactory 的区别

1.BeanFactory 是非IOC容器,而ApplicationContext 是IOC容器

2.ApplicationContext是BeanFactory的子类, BeanFactory只提供了基础访问Bean对象的功能,而ApplicationContext除了拥有 BeanFactory的全部功能,还有其他额外功能的实现,如国际化,资源访问以及事务传播方面等功能的支持。
3.它们两加载Bean的机制也是不同的,BeanFactory按需加载Bean,属于懒汉方式,使用它程序启动快,在后期获取对象时会慢一些;而ApplicationContext是饿汉方式,在创建时会将一次性将所有的Bean都加载,这种方式启动慢,启动之后获取对象就非常快了。
4.ApplicationContext 是BeanFactory的子类,继承了BeanFactory 的方法和属性,功能更加强大,也是现今相对于BeanFactory 更推荐使用的。而BeanFactory 属于是旧版本的产物,目前已经不建议使用。

总结

在这里插入图片描述

结束语

Spring是一个强大而灵活的框架,它可以帮助我们解决Java开发中的各种挑战。通过深入理解和掌握Spring的核心特性和主要模块,我们可以更加高效地进行Java开发,提高代码的质量和复用性。让我们一起探索Spring的世界,享受Java开发的乐趣吧!

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

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

相关文章

深度学习——第1章 深度学习的概念及神经网络的工作原理

1.1 序言——探索智能机器 千百年来&#xff0c;人类试图了解智能的机制&#xff0c;并将它复制到思维机器上。 人类从不满足于让机械或电子设备帮助做一些简单的任务&#xff0c;例如使用滑轮吊起沉重的岩石&#xff0c;使用计算器做算术。 人类希望计算机能够自动化执行更…

硬件基础:半导体和PN结

学模电之前&#xff0c;应该是已经学过基础电路的内容了。 那为什么还要学习模电呢&#xff1f; 因为电路分析中只是学了电路基础部分&#xff0c;主要涉及到的是无源器件&#xff0c;比如电阻电容电感&#xff1b;但是到了模电&#xff0c;就要开始学习有源器件了。 有源器件…

新手零基础学习彩铅画,彩铅快速入门教程合集

一、教程描述 画画是很美好的一件事情&#xff0c;你可以把你想到的&#xff0c;或者看到的都画下来&#xff0c;照相机可以拍下任何你看到的&#xff0c;但是你想到的任何事物&#xff0c;只能通过绘画的方式来表达。本套教程是非常不错的&#xff0c;彩铅的小视频教程&#…

C++ day49 买卖股票的最佳时机

题目1&#xff1a;121 买卖股票的最佳时机 题目链接&#xff1a;买卖股票的最佳时机 对题目的理解 prices[i]表示一支股票在第i天的价格&#xff0c;只能在某一天买入这支股票&#xff0c;并在之后的某一天卖出该股票&#xff0c;从而获得最大利润&#xff0c;返回该最大值&…

Windows利用MMDeploy部署OpenMMLab 模型并使用Python进行部署

目录 前言 一、准备工作 二、安装 MMDeploy 总结 前言 近期在用OpenMMLab构建模型&#xff0c;然后需要使用MMDeploy对模型进行部署。虽然官方文档提供了详细的说明&#xff0c;但是写的太繁琐了&#xff0c;而且在实际部署过程中&#xff0c;发现并不是所有步骤和内容都需要&…

C++ IO库

IO类 IO对象不能拷贝和赋值 iostream 表示形式的变化&#xff1a; 将100转换成二进制序列 然后格式化输出 x,y共用一块内存 输出的时候用不同的方式解析同一块内存 操作 格式化&#xff1a;内部表示转换为相应字节序列 缓存&#xff1a;要输出的内容放到缓存 编码转换&…

四、Zookeeper节点类型

目录 1、临时节点 2、永久节点 Znode有两种,分别为临时节点和永久节点。 节点的类型在创建时即被确定,并且不能改变。 1、临时节点 临时节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,

Sailfish OS 移动操作系统

Jolla 是一家曾经致力于开发智能手机和平板电脑的公司&#xff0c;但是这些产品并没有取得成功。后来 Jolla 将重心转向了基于 Linux 的 Sailfish OS&#xff08;旗鱼&#xff09;&#xff0c;并将其应用于现有设备上。Sailfish OS 是由 Jolla 在 MeeGo 基础上开发的移动操作系…

百度查询界面自定义

文章目录 起因步骤 纯个人纪录 参考以下师傅链接 爱吃猫的鱼儿-浏览器设置夜间模式以及百度搜索结果单列居中 起因 发现百度查询结果都在左边&#xff0c;想着能不能居中&#xff0c;发现已经有前辈写了插件&#xff0c;遂安装使用&#xff0c;看下效果 步骤 安装插件暴力猴…

PTA结构体经典编程题

目录 第一题&#xff1a;计算平均成绩 第二题&#xff1a;平面向量加法 第三题&#xff1a;查找书籍 第四题&#xff1a;通讯录排序 第五题&#xff1a;计算职工工资 第一题&#xff1a;计算平均成绩 思路&#xff1a;看到一个学生的基本信息&#xff0c;所以定义一个结构…

力扣每日一题day24[150. 逆波兰表达式求值]

给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都可以是一个整数或者另一个表达式。两个…

Unity中Shader指令优化

文章目录 前言解析一下不同运算、条件、函数所需的指令数1、常数基本运算2、变量基本运算3、条件语句、循环 和 函数 前言 上一篇文章中&#xff0c;我们解析了Shader解析后的代码。我们在这篇文章中来看怎么实现Shader指令优化 Unity中Shader指令优化&#xff08;编译后指令…

FL Studio2024水果编曲软件21.2.0中文版本下载更新

FL Studio2024是功能强大的音乐制作解决方案&#xff0c;使用旨在为用户提供一个友好完整的音乐创建环境&#xff0c;让您能够轻松创建、管理、编辑、混合具有专业品质的音乐&#xff0c;一切的一切都集中在一个软件中&#xff0c;只要您想&#xff0c;只要您需要&#xff0c;它…

汇编学习记录

前言 这篇文章是自己在专升本录取~本科开学前学习记录&#xff0c;破解软件的学习在2022年4月 - 2022年5月&#xff0c;汇编学习时间大约为2022年7月 - 2022年9月&#xff0c;我将往期上传的博文整理为一篇文章&#xff0c;作为归纳总结。 以后若继续学习相关领域&#xff0c;此…

vue3项目脚手架如何使用swiper, ‘vue-awesome-swiper‘报错解决(简单示例)

目录 前言 使用方法 效果图 1.下载swiper 2. 写入需要的页面 3.在对应页面引入组件 4.推荐页完整代码 前言 Vue3和Vue2在使用swiper时是有差别的&#xff0c;Vue3引入swiper需要注意Vu3的版本和swiper的版本&#xff0c;如果不匹配通常会报错 如下&#xff1a;当引用版本过…

Presto基础学习--学习笔记

1&#xff0c;Presto背景 2011年&#xff0c;FaceBook的数据仓库存储在少量大型hadoop/hdfs集群&#xff0c;在这之前&#xff0c;FaceBook的科学家和分析师一直靠hive进行数据分析&#xff0c;但hive使用MR作为底层计算框架&#xff0c;是专为批处理设计的&#xff0c;但是随…

Spingboot 之spring-boot-starter-parent与spring-boot-dependencies区分

在创建spring boot工程时&#xff0c;spring-boot-starter-parent 和 spring-boot-dependencies是二选一的关系&#xff0c;在pom中引入其中一个就可以了。 那么什么时候用spring-boot-starter-parent 和 spring-boot-dependencies呢&#xff1f;从字面名称上看&#xff0c;如…

从零开始,探索Spring框架的魅力与实践

Spring 1&#xff0c;介绍1.1 为什么要学?1.2 学什么? 2&#xff0c;Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 spring主要内容 2.3 Spring核心概念2.3.1 目前项目中的问题2.3.2 IOC、IOC容器、Bean、DI…

美容院管理系统服务预约会员小程序效果如何

美容院在美业场景中需求度较高&#xff0c;尤其女性爱美悦己消费逐年增加&#xff0c;如清洁焕肤、祛皱抗衰、激光脱毛等美容项目都有不少需求者。 互联网深入美业行业多年&#xff0c;传统线下经营模式已经很难满足当今客户消费流程&#xff0c;如品牌寻找、服务预约、到店、…

基于PHP的在线日语学习平台

有需要请加文章底部Q哦 可远程调试 PHP在线日语学习平台 一 介绍 此日语学习平台基于原生PHP开发&#xff0c;数据库mysql。系统角色分为用户和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqlphpstudyvscode 二 功能 学生 1 注册/登录/注销 2 个人中心 3 查看课程…