Spring 核心

Spring 核心

这篇文章,我们换个思路来学习,来践行一下以始为终,以面试题为引来重温一下Spring,毕竟孔子曾说,“温故而知新,可以为师矣。” ,可以通过这个链接看看有哪些常见的面试题

Spring 面试题 - 面试鸭 - 程序员求职面试刷题神器

面试题虽然很多,但是如果我们抓住Spring的本质,那么一切都显得有迹可循。如果你能静下心来通读Spring的官方文档,那么你就会觉得一切都是那么自然。所有的答案都在文档和源码中。所以这部分内容,我替代不了你,你需要自己通读一遍官方文档。这篇文章主要是对核心的内容做一个总结仅此而已。

Spring IOC

Spring中最基础的组件莫过于IOC容器,在聊IOC容器之前,我们先来看看IOC是什么?IOC是Inversion of Control 翻译为中文为控制反转,名字不重要,重要的是理解IOC的思想。在面向对象的软件设计中,一切皆对象,对象与对象之间存在依赖关系,一个功能往往需要多个对象互相配合才能实现。举个例子,用户下单这个功能,就需要订单服务与商品服务相互配合,在用户下订单之后,订单服务就会增加一个有关这个用户的订单,商品服务也会将对应的商品库存进行扣减,换句话说完成这个功能,需要订单服务对象,商品服务对象。而对象往往需要创建之后,甚至进行一些初始化操作才可用。如果将这类对象创建以及初始化的代码和业务代码耦合在一起,随着项目的扩展,整个工程就将变得难以维护。而IOC就是来解决这个问题的,即将对象创建以及初始化的代码与业务代码隔离开来。让开发人员可以更加关注业务代码,减轻开发人员的负担。而Spring IOC容器只不过是这种思想的一种实现。

那么问题来了,Spring IOC容器是如何将对象的创建与业务代码隔离的呢?这就不得不提出Spring中的另一个概念了,Spring Bean,Spring Bean就是被IOC容器管理的对象。而Bean的创建是基于一系列的配置,这些配置可能来自于XML配置文件,也可能来自Java代码。目前常用的配置Bean的方式是利用Java代码。具体而言就是我们熟知的这些注解 @Component @Service @Controller 以及 @Bean

举个例子方便大家理解,比如下面这段代码

@Service
public class StoreServiceImpl implements StoreService {@Overridepublic Object findByName(String name) {return "Mock Account";}
}

当Spring启动的时候,会扫描指定包下的全部class文件,如果扫描到有关Bean配置的注解,比如这里的@Service 就会创建一个BeanDefinition对象,这个对象对应的就是Bean的元信息,换句话说就是Bean的配置信息,然后Spring就可以根据这些配置信息创建出一个Bean对象来,也就是这里的StoreServiceImpl 对象。至于BeanDefinition的具体配置信息可以参考这个类GenericBeanDefinition

对象是创建完毕了,那么这些对象应该放在哪里呢?答案是在一个Map中,这也就是为什么IOC容器中有容器这两个字了。

IOC容器

这个Map就是存在Spring创建Bean对象的地方,这样子的容器有三个,这里先不讨论。

既然IOC容器负责管理对象,那么对象之间的依赖关系也需要IOC容器来解决,这就是我们常说的依赖注入即DI。而依赖注入最常见的问题就是依赖循环。场景的依赖循环场景有这样三个

  1. 对象A依赖对象B,对象B依赖对象A
  2. 对象A依赖对象B,对象B依赖对象C 对象C依赖对象A
  3. 对象A依赖对象A

Spring的IOC容器其实解决了大部分的依赖循环的问题,具体的解决办法就是利用上面提到的那三个容器。也被叫做Spring的三级缓存。但是需要注意的是,出现依赖循环,这个问题是设计上的问题,所以如果出现依赖循环,我们应该想想如果改造设计,而不是指望Spring来帮我们解决。

要说在Spring中可以和IOC容器这个特点相提并论的就只有Spring AOP了。

Spring AOP

AOP是一种编程范式,和面向对象编程一样,它的名字叫做面向切面编程,其本质其实是代理模式的运用。比如,在API的管理中,有些API只有级别比较高的用户才能使用,那么我们不得不进行权限校验,这类代码在每个API中都会使用,如果让这些代码与业务代码写在一起,就会过于耦合。而AOP就是将这类通用逻辑的代码与变化较多的业务代码隔离开来。大部分的AOP实现都是使用代理模式实现的。Spring AOP也不例外,使用的是基于类的动态代理,而不是Java标准库自带的基于接口的动态代理。更加详细的内容可以参考官方文档 https://docs.spring.io/spring-framework/reference/core/aop.html ,正如我之前提到的那样,如果你有时间,你一定要去通读Spring的官方文档,你一定会收获颇多。

Spring提供了很多好用的特点,可以简化我们的开发,比如,声明式事务,异步任务,条件注解,事件驱动模式等等。但是这些特点都是基于IOC容器以及AOP来实现的。所以彻底理解Spring IOC和Spring AOP的内容很重要。

如果你时间不充裕,我也推荐你读一读Spring官方文档中IOC以及AOP相关的内容

The IoC Container :: Spring Framework

Aspect Oriented Programming with Spring :: Spring Framework

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构师案例思路:架构设计(附真题)

目录 案例题目规则 架构设计案例分析 知识总纲(理解并背诵) 架构风格(理解并背诵) 质量属性(理解并背诵) 性能 可靠性 可用性 可修改性 功能性 可变性 互操作性 架构评估(理解并背诵) 具体架构风格(理解) 层次架构 两层C/S架构 三层C/S架构 B/S架构…

使用 Nuxt Kit 的构建器 API 来扩展配置

title: 使用 Nuxt Kit 的构建器 API 来扩展配置 date: 2024/9/24 updated: 2024/9/24 author: cmdragon excerpt: 摘要:本文详细介绍了如何使用 Nuxt Kit 的构建器 API 来扩展和定制 Nuxt 3 项目的 webpack 和 Vite 构建配置,包括扩展Webpack和Vite配置、添加自定义插件、…

简单学习 原码反码补码 学会了你才是真正的程序员了

一、简单介绍原码反码补码 首先我们需要知道的是原码反码补码是一个人为的行为,因为机器看的都是所谓的补码,这个反码只是作为补码的到原码也就是人能看懂的跳板,所以计算机无论是计算器里面的东西还是他底层运行的二进制代码都是补码&#x…

思科认证难考吗?思科认证备考方法与技巧分享

思科认证在IT行业具有广泛的认可度,表明持有者拥有专业的技术能力水平,对未来的升职加薪有很大帮助。但在考思科认证之前很多人都担心“思科认证难考吗”这个问题,实际上这主要看你考的认证等级,ccna、ccnp等。此外,考…

代码随想录算法day40 | 动态规划算法part13 | 647. 回文子串,516.最长回文子序列

647. 回文子串 动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解。 力扣题目链接(opens new window) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的…

2024/9/25 英语每日一段

“Banning phones or social media is something parents often do as a form of punishment, me included. But in doing so you make the phone even more important, taking on this totemic importance in your child’s eyes,” she says. Goodin says that young people …

基于springboot+vue超市管理系统

基于springbootvue超市管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本无人超市管理系统就是在这样的大环境下诞生,其可以帮助使用者在…

CNN网络训练WISDM数据集:模型仿真及可视化分析

卷积神经网络(CNN)因其强大的特征提取能力和深度学习架构而备受推崇,CNN在处理图像数据时展现出的卓越性能,使其成为解决各种视觉识别任务的首选工具。WISDM数据集是一个广泛用于运动估计研究的基准数据集,它包含了多个…

腾讯邮箱上传附件卡、慢、无法上传问题处理

1、检查文件中转站容量是否已满 2、建议用户打开链接https://exmail.qq.com/qy_mng_logic/wasmHelper?typehashv2,看是否可以正常访问。(能打开下载就表示可以正常访问) 3、让用户切换到4G或者其他网络再重新上传附件是否会重现问题&#xf…

(14)关于docker如何通过防火墙做策略限制

关于docker如何通过防火墙做策略限制 1、iptables相关问题 在Iptables防火墙中包含四种常见的表,分别是filter、nat、mangle、raw。 filter:负责过滤数据包。 filter表可以管理INPUT、OUTPUT、FORWARD链。 nat:用于网络地址转换。 nat表…

FTP服务搭建

FTP服务搭建 yum install vsftp匿名用户模式 备份配置文件,并重新生成一个 mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak cat /etc/vsftpd/vsftpd.conf_bak | grep -v "#" > /etc/vsftpd/vsftpd.conf{local_enableYES write_enableYES …

Redis 分布式缓存服务(集群)

作者:程序那点事儿 日期:2023/11/17 13:05 准备6台虚拟机,ip分别是 192.168.10.101 192.168.10.102 192.168.10.103 192.168.10.104 192.168.10.105 192.168.10.106 创建6个节点 mkdir -p /usr/local/cluster/redis-node1 #对应192.168.10.…

【微服务即时通讯系统】——etcd一致性键值存储系统,etcd的介绍,etcd的安装,etcd使用和功能测试

文章目录 etcd1. etcd的介绍1.1 etcd的概念 2. etcd的安装2.1 安装etcd2.2 安装etcd客户端C/C开发库 3. etcd使用3.1 etcd接口介绍 4. etcd使用测试4.1 原生接口使用测试4.2 封装etcd使用测试 etcd 1. etcd的介绍 1.1 etcd的概念 Etcd 是一个基于GO实现的 分布式、高可用、一致…

Linux 进程与进程状态

目录 1.进程。 1.进程的概念 2.并行和并发 3.并行和并发的区别: 4.PCB(程序控制块) 5.进程组与会话。 6.进程状态。 1.进程。 1.进程的概念 进程是操作系统进行资源分配和调度的一个独立单位。每个进程都运行在操作系统的控制之下&…

心觉:如何重塑高效学习的潜意识(1)两种方法的优缺点

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作180/1000天 你的学习习惯是什么呢 学习的时候是感到轻松吗 很多人感觉现在是知识大爆炸的时代,每天都会产生海量的知…

人工智能助力阿尔茨海默症治疗:微软与上海精神卫生中心的新研究

最近,微软研究院与上海市精神卫生中心合作,基于微软 Azure OpenAI 服务中的多模态大模型,开发了一种名为“忆我”(ReMe)的个性化认知训练框架。这一创新项目旨在通过数字化手段扩展自动化认知训练的范围,为…

Spring MVC 参数校验 总结

1. 简介 Sping MVC提供了参数校验的方便注解。 2.代码 在pom.xml中添加依赖&#xff1a; <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>8.0.0.Final</version&g…

如何提升亚马逊与速卖通的关键词搜索排名?

在电商平台上&#xff0c;一个不可忽视的事实是&#xff0c;大部分消费者&#xff08;超过80%&#xff09;在搜索产品时&#xff0c;主要集中在搜索结果的前两页。如果你的产品未能跻身这些显眼的位置&#xff0c;很可能就会错失大量的潜在客户。因此&#xff0c;提升关键词搜索…

PG duckdb插件 pg_quack部署与使用

一.pg_quack简介 pg_quack 是一个创新的 PostgreSQL扩展&#xff0c;它将 DuckDB-—一个嵌入式列式数据库 管理系统集成到PostgreSQL中。这个开源项目为开发者提供了一种在同一个数据 库环境中利用高性能数据处理和存储的新方式,使得在PostgreSQL在OLAP的性能 上得到了很大的提…

Docker容器常用命令详解

Docker容器常用命令&#xff0c;我们经常使用&#xff0c;又经常忘记&#xff0c;今天我们系统分析一下&#xff1a; 1、查看运行的进程 #列出所有运行的容器 sudo docker ps#列出所有容器&#xff0c;包括运行和停止的 docker ps -a #列出所有容器&#xff0c;并过滤 docker…