当前位置: 首页 > news >正文

Spring 框架精髓:从基础到分布式架构的进阶之路

一、概述

(一)Spring框架概念

1.概念:

  • Spring框架是一个用于简化Java企业级应用开发的开源应用程序框架。

2.Spring框架的核心与提供的技术支持:

  • 核心: 
    • IoC控制反转|反转控制:利用框架创建类的对象的技术。 
    • AOP面向切面的编程思想:通过切面类和方法为核心业务提供非核心的业务技术。
  • 本身提供了技术支持: 

提供了表现层框架:SpringMVC

提供了持久层框架:SpringJDBC

提供了整合其它的三方框架和类库的基础。(Spring框架本身使用Maven框架管理项目)。

3.Spring框架本质:管理项目中的对象(即创建对象和维护对象与对象之间的关系)。

4.Spring的优势

5.Spring的架构

(二)Spring框架的IoC容器

1.IoC

概念:

即控制反转,把创建对象的权利交给框架,即将对象的创建、初始化、存储、管理交给Spring容器。

实质:

一种通过描述来生成或者获取对象的技术。

常用概念:

SpringBean:在Spring中把每一个需要管理的对象称之Spring Bean。

SrpingIoC容器:在Spring中管理这些Bean的容器。

管理过程:

第一步:将需要的POJO提前在配置文件中进行描述(程序员负责)。

第二步:Spring会根据配置文件中的描述生成IoC容器并装配Bean(Spring框架负责)。

第三步:需要该Bean的对象时,通过API获取即可(程序员负责)。

管理过程示意图:

2.耦合与解耦

耦合与解耦

所谓耦合:在项目开发时,经常会遇到在一个程序中会new另外一个类的对象,而在new对象时,会造成当前这个程序,严重的依赖于其它对象,会造成程序之间的依赖程度提升,而程序和程序之间的依赖关系被称之为耦合。依赖关系越高,耦合性就越高。 

在项目开发时,我们希望程序和程序之间的耦合程度越低越好。 

解耦:解除对象与对象之间的依赖关系就叫解耦。 

  • 常见的解耦方式 
    • 1.分层开发解耦方式 
      • 开发思想:将程序各组成部分定位于不同层次,达到降低耦合度的目的。 
      • 常见开发模式:工厂模式解耦
    • 2.使用框架解耦方式开发思想:IoC和分层开发。

二、Maven整合Spring常规开发

(一)开发步骤

第一步:导入Spring依赖

第二步:通过xml文件装配类(Spring的Bean配置)

第三步:读取Bean的配置文件

第四步:通过Api获取Bean

方式一:通过装配类的名字获取bean(源文件中)

方式二:通过类的字节码对象获取bean的对象。

当通过方式二获取Bean对象时,配置文件中不能出现两个不同id值,但class值相同的bean元素。否则会报错。

示例:

(二)ClassPathXmlApplicationContext对象的常用Api。

1.常用API

2.示例:

(三)Bean对象的作用范围

1.概念:

所谓Bean对象的作用范围即作用域,即c|c++的作用域是不同的两个概念。

这里的Bean作用域用于指定创建Bean的创建方式。

2.指定作用范围:

方法:

通过xml配置方式:在bean元素中添加scope属性。

示例:

scope属性的值:

singleton:单实例,默认值。

特点:

Spring容器只为该类创建一个对象,并将该对象存在Bean池中,每次获取都获取的是同一个对象。

该类实例的创建到销毁的全过程由Spring框架管理。

prototype:多实例。

特点: 

Spring容器可以为该类创建多个对象中,每次获取时都会重新创建对象。

Spring容器只负责该类的创建,不负责销毁,销毁由JVM的垃圾回收机制负责。

3.作用域的选择:

使用频次维度考虑:

使用频率高的,且没有线程安全的bean:建议使用单例。

原因:始终只有一个实例:可以减少创建时间及获取时间,同时,可以减少内存压力。

使用频次低的,且存在线程安全风险的bean:建议使用多例。

原因:单例Bean总是伴随框架开始而开始,框架结束而结束,占用内存而多例Bean 则不会。

(四)Bean对象的生命周期

1.生命周期概念:

指一个对象何时创建、何时销毁以及创建之后到销毁之前所处的状态。

2.单例Bean对象的生命周期:

创建:当Spring容器对象创建时,此类对象就会被创建。

内存驻留时间:只要容器没有销毁,bean对象就不会销毁。

销毁时机:当Spring容器销毁时,bean对象也会跟前销毁。

3.多例Bean对象的生命周期:

创建时机:当通过IoC对象获取Bean对象时,才会创建Bean对象。​​​​​​​

内存驻留时间:只要对象是在使用过程中,则就会一直驻留内存。​​​​​​​

销毁时机:当对象长时间不使用,且没有别的对象引用时,则Java垃圾回收机制就会对该对象析构。

4.总结:

单例Bean对象:由Spring全程管理此类对象(即创建、初始化、存储、销毁)。​​​​​​​

多例Bean对象:只由Spring负责创建和初始化。不负责存储和销毁(由JVM的CG机制负责)。

5.生命周期方法

初始化方法:

作用:bean对象创建后执行额外的特定的初始化操作,如帮助对象请求各类资源

执行时机:构造函数创建对象后立即执行。

创建方法:使用注解@PostConstruct描述被指定为初始化方法的方法。

示例:

@PostConstruct
public void  initObjectPool()
{
    System.out.println("initObjectPool()被调用了");
}

适用对象:单例|多例Bean对象。

析构方法:

作用:用于指定销毁Bean对象前额外操作,如释放资源等。

执行时机:Bean对象销毁前。

创建方法:使用注解@PreDestroy描述被指定为析构方法的方法。

示例:

@PreDestroy
public void preDestroyObjectPool()
{
    System.out.println("preDestroyObjectPool()被调用了");
}

适用对象:单例Bean对象。

(六)Spring的DI(依赖注入)

1.依赖注入概念:

2.依赖注入方式:

set方法注入:

概念:通过Bean对象的Set方法实现依赖注入。

配置文件方式:修改Bean装配配置文件。

方法:

构造方法注入:

概念:通过Bean对象的构造函数方法实现依赖注入。

配置文件方式:修改Bean装配配置文件。

方法:

三、Spring全注解开发

(一)自定义开发

1.开发步骤

第一步:定义Spring的配置类用于取代bean装配的配置xml文件。

第二步:获取IoC容器对象

​​​​​​​

第三步:通过IoC容器的API获取所需Bean对象。

可以通过Bean对象所有底层Bean池中的名字,也可以通过Pojo的字节码对象获取

两中方式使用方式和存在的问题与xml方式获取对象时一致。

2.常用注解

@Configuration:

作用:告诉Spring框架当前类是一个Java配置类。

说明:

该注解用于描述类。

此时描述类的具体作用:

所描述类相当于spring的bean.xml(类的装配配置文件)。

通过该类可以获取Spring的IoC容器。

@Bean

作用:将当前方法的返回值作用bean装配到spring容器中。

说明:该注解用于描述方法。所描述的方法与装配的xml文件中的bean元素类似,区别在于:方法中的存入bean池中的对象是new的,而bean元素描述的类的对象是通过框架创建的。

参数name:可选。用于指定bean池中该对象的名字,类似于bean标签中的id属性。

当省略参数时,装配bean到IoC容器中的对象的名字即为@Bean所描述的方法的方法名。

当参数存在时,则对象名即为name的值。

3.使用时机:

如果需要装配第三方技术中的bean时,只能通过自定义开发方式,装配bean对象。

(二)使用Spring扫描装配开发

1.开发步骤

第一步:使用@Component注解描述需要自动装配到IoC容器中的对象所属的Bean。​​​​​​​

第二步:使用@ComponentSan注解描述配置类(即使用@Configuration所描述的类)指定扫描的包路径。​​​​​​​

第三步:获取IoC容器对象。​​​​​​​

第四步:通过IoC对象API获取装配的Bean对象。​​​​​​​

示例:

2.常用注解

@Component:

作用:标记所描述的类需要作为bean装配到Spring的IoC容器中。

说明:

参数:

value:可选参数:用于指定存放在Bean池中的名字。

省略时:名字为该注解所描述的类的类名且首字母小写。(默认情况)

存在时:名字为value的值,其中value=可以省略。

@ComponentScan:

作用:定义以何中策略扫描装配Bean

说明:

参数:

value:可选参数:用于指定扫描策略。

省略时:默认扫描当前类所在的包及其子包。

存在时:仅扫描value的值所指定的包,其中value=可以省略。

3.使用时机:

如果需要装配开发者自定义类的对象时,使用Spring扫描的方式装配Bean。

(三)使用注解指定Bean对象的作用域和加载时机

@Scope

作用:用于指定所描述类的对象的作用域。该注解为可选的,无此注解,Spring默认指定当前类的对象的作用域为单实例的。​​​​​​​

说明:

参数:

value:可选参数,用于指定该类对象的作用域。

省略或当value值为:singleton时:默认为单例。

示例:@Scope("singleton")|@Scope|@Scope(value="singleton")

当value值为:prototype时:指定所描述类的对象为多例。

示例:@Scope("prototype")|@Scope(value="prototype");

@Lazy

作用:指定所描述的类的加载时机,默认为未延迟加载(即不使用该注解时)。​​​​​​​

说明:

参数:

value:可选参数,用于指定Bean对象是否延迟加载。默认值为true。

当为true时,延迟加载。

示例:@Lazy|@Lazy(true)|@Lazy(value=true);

当为false时,不延迟加载。

示例:@Lazy(false)|@Lazy(value=true);

加载时机:

当指定延迟加载时,则会在获取Bean对象时创建。

未指定延迟加载时,则会IoC容器对象创建时就会加载。

前置条件:

该注解只对单例Bean起作用,对多例Bean不起作用。

原因:多例Bean本身即为获取时创建。

使用时机:

针对大型的且使用时机较晚,又需要Spring框架予以装配的单例Bean对象可以使用延迟加载。

(四)使用注解为装配类注入依赖(DI注入)

注解依赖注入规则:

当一个类的属性需要Spring注入依赖的必须条件

该属性所在类必须由Spring管理

该属性必须使用特定注解描述,如:@Vaulue,@Autowired

示例:

@value

作用:使用该注解的实参为所描述的属性赋值。

说明:

该注解用于描述类的属性。

参数:

value:必需参数且无默认值。值为属性赋的值。

示例:

前置条件:

该注解只能为基本数据类型及对应的包装类型和String类的属性赋值。

该注解描述的属性的所属的类必须使用@Component及同等作用的注解描述(@Controller、@Service、@RestController、@Mapper等)

@Autowired

作用:使用该注解为描述的属性赋值。

说明:

该注解描述是类的属性,该属性为自定义类类型。此时将通过暴力反射完成赋值

可以描述类的构造函数。此时,将通过构造方法完成赋值。

可以描述类的某一属性的set就去。此时,将通过set方法完成赋值。

参数:无

前置条件:

该注解只能为开发者自定义类或接口实现类的对象注入依赖。

该注解描述的属性的所属的类必须使用@Component及同等作用的注解描述(@Controller、@Service、@RestController、@Mapper等)

@Autowired依赖注入机制:

首先,会依据类型进入依赖注入,

其次,当IOC容器中该类型的对象有多个时,@Autowired将依据对象名进入依赖注入。

@Autowired注解使用细节(即匹配规则)

前置条件:该属性描述的是接口。

匹配规则:

第一种情况:Bean池中有一个或没有该接口的实现类对象时。

该注解会匹配该接口类型的实现类。

如果没有该接口的实现类,则会报异常如下所示:

如果有该接口的实现类,且只有一个,就会使用该实现类的对象注入@Autowired描述的对象。如下所示:​​​​​​​

第二种情况:当Bean中有多个同一接口的实现类时。

该注解首先匹配属性类型,发现Bean池中有多个实现类时,会继续将Bean池中的对象名与属性名进行匹配;

如果未匹配到,则报如下异常:

org.springframework.beans.factory.NoUniqueBeanDefinitionException

如果匹配到,则使用匹配到的Bean对象实现DI注入。如下所示:

相关文章:

Spring 框架精髓:从基础到分布式架构的进阶之路

一、概述 (一)Spring框架概念 1.概念: Spring框架是一个用于简化Java企业级应用开发的开源应用程序框架。 2.Spring框架的核心与提供的技术支持: 核心: IoC控制反转|反转控制:利用框架创建类的对象的…...

深入理解C++ Lambda表达式:语法、用法与原理及其包装器的使用

深入理解C Lambda表达式:语法、用法与原理及其包装器的使用 lambda表达式C98中的一个例子lambda表达式语法lambda表达式各部分说明捕获列表说明 函数对象与lambda表达式 包装器function包装器 bind 🌏个人博客主页: 个人主页 本文深入介绍了…...

C# 编程语言:跨时代的革命

C# 是一种由微软开发的现代、类型安全、面向对象的编程语言,自2000年推出以来,它已经成为.NET平台的核心组成部分。在本文中,我们将探讨C#语言的特点、优势以及它在软件开发领域中的应用。 C# 语言特点 类型安全和自动垃圾回收 C# 是一种类…...

恋爱脑学Rust之Box与RC的对比

在遥远的某个小镇,住着一对年轻的恋人:阿丽和小明。他们的爱情故事就像 Rust 中的 Rc 和 Box 智能指针那样,有着各自不同的「所有权」和「共享」的理解。 故事背景 阿丽和小明准备共同养一株非常珍贵的花(我们称之为“心之花”&…...

Rust 力扣 - 1423. 可获得的最大点数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 题目所求结果存在下述等式 可获得的最大点数 所有卡牌的点数之和 - 长度为(卡牌数量 - k)的窗口的点数之和的最小值 我们遍历长度为(卡牌数量 - k)的窗口&#…...

Android15音频进阶之Cuttlefish搭建音频开发环境(九十二)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…...

发现不为人知的AI宝藏:发现AI新天地! —— 《第八期》

在人工智能(AI)领域,尽管ChatGPT、Midjourney等知名产品广为人知,但还有许多小众而有趣的AI工具等待你的探索。本文将推荐五款实用的AI工具,它们不仅功能强大,而且使用简单,帮助你在各种场景中提…...

基于物联网设计的地下煤矿安全监测与预警

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】NBIOT-BC26模块【2】MQ5传感器【4】DHT11传感器【5】红外热释电人体检…...

Java 23 的12 个新特性!!

Java 23 来啦!和 Java 22 一样,这也是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持。下一个长期支持版是 Java 25,预计明年 9 月份发布。 Java 23 一共有 12 个新特性! 有同学表示&…...

.NET 8 中 Entity Framework Core 的使用

本文代码:https://download.csdn.net/download/hefeng_aspnet/89935738 概述 Entity Framework Core (EF Core) 已成为 .NET 开发中数据访问的基石工具,为开发人员提供了强大而多功能的解决方案。随着 .NET 8 和 C# 10 中引入的改进,开发人…...

ai数字人分身123口播克隆数字人小程序源码_博纳软云

功能配置 一、用户 用户管理小黑屋用户反馈登录设置短信参数 二、作品 视频作品背景音乐库背景音乐分类 三、形象分身 上传记录视频要求参数配置 四、声音克隆 克隆记录参数配置声音要求文案示例 五、AI文案 生成记录创作模型模型分类Al配置 六、充值 充值订单积分套…...

从0开始学PHP面向对象内容之(类,对象,构造/析构函数)

上期我们讲了面向对象的一些基本信息&#xff0c;这期让我们详细的了解一下 一、面向对象—类 1、PHP类的定义语法&#xff1a; <?php class className {var $var1;var $var2 "constant string";function classfunc ($arg1, $arg2) {[..]}[..] } ?>2、解…...

openGauss数据库-头歌实验1-5 修改数据库

一、查看表结构与修改表名 &#xff08;一&#xff09;任务描述 本关任务&#xff1a;修改表名&#xff0c;并能顺利查询到修改后表的结构。 &#xff08;二&#xff09;相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.如何查看表的结构&#xff1b; 2.如…...

《JVM第3课》运行时数据区

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 运行时数据区结构图如下&#xff1a; 可分为 5 个区域&#xff0c;分别是方法区、堆区、虚拟机栈、本地方法栈、程序计数器。这里大概介绍一下各个模块的作用&#xff0c;会在后面的文章展开讲。 类加载子系统会把类信息…...

阅读笔记 Contemporary strategy analysis Chapter 14

来源&#xff1a;Robert M. Grant - Contemporary strategy analysis (2018) Chapter 14 External Growth Strategies: Mergers, Acquisitions, and Alliances 合并、收购和联盟 Ⅰ Introduction and Objectives 企业并购与联盟是公司实现快速扩张的重要战略工具。通过这些手段…...

2024网鼎杯青龙组wp:Crypto2

题目 附件内容如下 # coding: utf-8 #!/usr/bin/env python2import gmpy2 import random import binascii from hashlib import sha256 from sympy import nextprime from Crypto.Cipher import AES from Crypto.Util.Padding import pad from Crypto.Util.number import long…...

能通过Ping命令访问CentOS 9 Stream,但在使用Xshell连接

能通过Ping命令访问CentOS 9 Stream&#xff0c;但在使用Xshell进行SSH连接失败 1. **确认SSH服务状态**&#xff1a;2. **检查SSH配置**&#xff1a;要检查和设置PermitRootLogin选项&#xff0c;您需要编辑SSH配置文件/etc/ssh/sshd_config。以下是具体步骤&#xff1a;1. 打…...

Oracle 第19章:高级查询技术

在Oracle数据库中&#xff0c;高级查询技术是数据库管理员和开发人员必须掌握的重要技能。这些技术能够帮助优化查询性能&#xff0c;简化复杂的查询逻辑&#xff0c;并提高数据处理的效率。本章将重点讨论两个关键概念&#xff1a;子查询和连接与并集操作。 子查询 定义: 子…...

Excel:vba运行时错误“7“:内存溢出错误

我这里出现这个错误是在批注中插入图片时报错 原因:我插入的图片不都是jpg的类型的&#xff0c;但是其中的两张图片是webp类型的&#xff0c;但是我把文件后缀名修改成了jpg&#xff0c;以为变成了jpg类型的图片&#xff0c;但是图片在批注里面无法显示&#xff0c;所以运行到第…...

【MyBatis源码】BoundSql分析

基础 BoundSql是对SQL语句及参数信息的封装&#xff0c;它是SqlSource解析后的结果。Executor组件并不是直接通过StaticSqlSource对象完成数据库操作的&#xff0c;而是与BoundSql交互。BoundSql是对Executor组件执行SQL信息的封装&#xff0c;具体实现代码如下&#xff1a; …...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...