Java开发 - 探寻Spring的秘密

news2024/12/28 10:48:13

前言

Spring是企业级J2EE一站式解决方案,提供了整个项目的表现层、业务层、持久层,而且,它的生态特别完善,可以和其他框架无缝对接,现在做Java的哪个项目里没有Spring的说出不去都不信。但往往我们开发者只重视项目是不是run起来了,而忽略了去了解Spring本身,所以很多开发者仅仅是停留在了使用的层次。博主也不例外,说出来怕你不信,博主最不喜欢的就是Spring了,用的很爽啊,但是就像我们打游戏,玩着很爽,让你自己做一款出来那不是玩呢?所以,这也是博主不喜欢Spring的原因,底层太复杂,想要明白其原理,很难!但今天我们不去做复杂的源码分析(就是想也没这能力啊),我们就来了解了解支撑Spring工作的一些基本的机制。

Spring的特征

Spring的特征用一张图表示如下:

254669c96bb6498a98cd029cf7703c39.png

轻量

做为一个支持底层的几乎是万能的框架来说,Spring哪里算轻量级的?但这只是表象的认知,从其引入的JAR包来说,spring-web-5.2.0.RELEASE.jar和spring-core-5.2.0.RELE ASE.jar的大小仅仅只有1M多,从资源利用上来说,它只需要少量的系统资源就可以运行。麻雀虽小,五脏俱全,Spring同时还是模块化的,可以根据需要引入不同的模块,而不需要一股脑的引入全部,从这一点来说,又非常的灵活多变,搞的博主都有点不好意思了,算是今天才真正了解了它的这一特点。

子曰:朝闻道,夕死可矣。但博主只想多多的朝闻道。

控制反转

Spring的控制反转指一个对象依赖的对象会在Spring容器初始化完成后主动将依赖的对象传递给他,而不需要这个对象自己去创建或者查找其依赖的对象,基于此,Spring实现了依赖对象之间的解耦,我们平时用的比较多的就是@Autowired注解。

面向容器

容器方面主要指Spring实现了对象的配置化生成和生命周期管理,通过XML文件或者注解的方式,应用可以配置每个Bean对象创建和销毁的时间,还有创建的先后顺序和依赖关系。Spring中的对象我们根据其使用,基本可以推断它是类似单例的工作模式,但如果你想自己重复创建,那也是被允许的,但具体怎么用还要由Bean对象的生命周期来决定,这是通过prototype 属性来定义的。

面向切面

Spring提供了面向切面编程的能力,博主首先想到的就是过滤器,因为在登录的流程中我们在登录成功后需要在请求头获取令牌。切面通过分离系统逻辑和业务逻辑来提高系统的内聚性,业务层只需要关注并实现和业务相关的代码,而不需要关注系统功能(例如系统日志、事务支持)和业务功能的复杂关系,Spring 通过面向切面技术将系统功能自动织人业务逻辑的关键点。就像是切开一条管道,接入了另一条管道一样,非常的形象。

框架集合 

Spring管理对象的方式非常的灵活,对象可以被声明式的创建,例如通过 XML文件或注解的方式定义对象和对象之间的依赖关系,作为一个比较基础的框架,Spring可以允许事务管理、持久化等框架集成和提供Java Web服务的能力,我们现在的项目也是在其基础上进行了框架的集成,当然,我们现在更多的采用Spring Boot,但Spring Boot和Spring在本质上区别并不大,只是Spring Boot更加的智能化,集成度更加高,使用起来更加便利。

Spring的模块

此处必须有图:

108328be38c5475eba7f42aaa0d15b2f.png

 这是一张比较经典的Spring模块图,里面详细列出了Spring模块化后的各个部分,好家伙,可以说一半以上的模块博主都没听过,但这并不妨碍它在我们开发的过程中所起到的举足轻重的作用。下面,我们就来分别认识一下这些模块都是什么,都做什么。

核心容器层

Spring-Beans

我们先来说说什么是Bean,Bean是计算机自动生成的类,是由Spring IoC容器实例化、组装和管理的对象。

Spring-Beans模块通过工厂模式实现对象的创建,再通过XML的方式实现了对象的声明式管理,将复杂的对象依赖关系从实际编码中解耦了出来,实现了前面所说的对象的声明式管理。在这个过程中,我们来猜一下,有没有反射机制?可以说,所有的以解耦为目的的框架也好,模块也好,恐怕都离不开反射。也就是说,Bean并不是由开发者创建管理的,而是程序运行时由Spring通过反射生成并统一管理的对象或者实例。这是博主说的,大家可以去求证,求打脸【贱兮兮】。

Spring-Core 

一看见Core就知道这是Spring的核心模块,它包含了控制反转和依赖注入,关于这两个词我相信大家起码知道他们大概是啥意思。但这里博主还是要再说一遍。依赖注入是在一个Bean实例引入另一个Bean实例时,Spring会自动创建其所依赖的Bean实例,并注入到对应的Bean中。关于控制反转,博主在上面Spring的特征已经讲过,但过于抽象,我们可以理解成本来应该由开发者控制的Bean对象现在控制权交给了Spring容器,控制权反转了【摊手】。

Spring-Context

要了解Spring-Context,那你就要先去了解Spring-Beans和Spring-Core,如果把Spring-Context比作一栋高楼,那么Spring-Beans和Spring-Core就是高楼的地基,Spring-Context 继承自 Spring-Beans 模块,并且添加了国际化,事件传播,资源加裁和透明地创建上下文等功能。

Spring-Context还额外提供了一些J2EE的功能,比如 EJB、 JMX 和远程调用等,ApplicationContext接口还是Spring-Context 模块操作 Bean入口的产物。

Spring-Conext-Support还提供了将第三方库集成到Spring-Context的能力,比如缓存、邮件、模块、调度引擎等,不过这些都是更加偏底层和源码的部分,我们知道有这些就行,要是说掌握?那真是......一言难尽。

SpEL

SpEL提供了丰富的表达式和语言支持,更贴近于我们的实际变成。由于SpEL在JSP 2. 1表达式语言规范的基础上进行了扩展,支持set方法、get方法、属性赋值、方法调用、访问数组集合、索引 容、逻辑算术运算、命名变量、基于名称在Spring loC 容器检索对象,同时支持列表的投影选择和聚合等功能。额,像不像天书?像!所以,你只需要了解前半部分就行,后半部分请自动忽略,这辈子恐怕都用不上,换句话说,就是用上了,你也不知道是它,所以不要纠结,如果你精益求精,非要知道是啥,到时记得告诉博主【哈哈】。

数据访问层

如果没有深入的了解,大眼一扫,博主只认识JDBC和Transactions,所以其他到底是什么?我们下面来一一解答。

JDBC

JDBC全称Java Data Base Connectivity,是用来连接数据库的,JDBC提供了一个抽象层,Spring通过这个抽象层不同数据库的灵活切换,而且还不用担心不同数据库的语法是否兼容。

ORM

ORM全称Object Relational Mapping,是对象关系映射,它提供了对象关系映射的API,包括 JPA ( Java Persistence API )、 JDO( Java Data Obj ct) 和Hibernate等。基于该模块, ORM 框架能很容易地和Spring其他功能整合,一个比较典型的案例就是事务管理,这个其实挺抽象,到这里也差不多了,可以说用到了你也不知道是这玩意儿,是不是很尴尬?好奇怎么用的可以再深入了解。

OXM

全称Object XML Mapping,字面意思是对象XML映射,此模块实现了对 OXM的支持,比如 JAXB、Castor、XML Beans、JiBX、XStream。我只能说,我们实际编码中未必真的会接触,但是人家都帮我们做好了,突然不知道写这个有啥用,有几个人真正搞明白的?个人认为,对于这些模块,了解大的模块就行,比如这里是数据访问层,下面的知道个JDBC就行,其他的了解即可。

JMS

全称Java Message Service,这个博主知道,如果你还不知道,那你看下面这句话:包含消息的生产( Produce )和消费( Consume )功能。看着像MQ?是的,从Spring4.1 开始,Spring 集成了 Spring-Messaging模块,用于实现对消息队列的支持。

Transactions

Transactions就是事务管理,这个大家应该都比较熟悉,该模块基于接口实现了声明式事务管理,编程式事务下,应用程序需要调用beginTransaction()、commit()、rollbac()等方法来实现事务的管理,Spring声明式事务通过注解或者配置就可以实现事务的管理,具体的工作都由Spring自动完成,开发者不必再关心提交和回滚的问题。

Web应用层

我们平时说的Java指的是Java Web,就是Java应用程序,用来做Web交互和数据传输等的相关功能。具体就是由以下几个模块组成的。

Web

Web模块提供了面向web的基本功能,还提供了HTTP (Hyper Text Transfer Protocol ,超文本传输协议)客户端及 Spring 远程调用与Web 相关的部分,Web模块基于 Servlet 监听器初始化 IoC 容器

Web-MVC

Web-MVC 模块为 Web 应用提供了模型视图控制( Model View Controller , MVC)和REST API 服务的实现。Spring MVC 框架使数据模型和视图分离,数据模型负责数据的业务逻辑,视图负责数据的展示。同时,Web-MVC 可与 Spring 框架的其他模块方便地集成。

Web-Socket

Web-Socket 模块提供了对 WebSocket-Base 的支持,用于实现Web 应用程序中服务端和客户端实时双向通信,尤其在实时消息推送中应用广泛。

Web-Portlel

Web-Portlet 模块提供了基于 Portlet 环境的 MVC 实现,并提供了与 Spring Web-MVC 模块相关的功能。

总结

前面的都还好,这个Web层总有点生无可恋的赶脚,我们恐怕了解不了那么深,当然不排除一些大神很有天赋,一看就懂,总之博主觉得这些看看就行。

其他模块 

剩下的模块共五大块,我们来分别看下都是什么。

AOP

AOP提供了面向切面编程的实现,允许应用程序通过定义方法拦截器和切人点来实现系统功能和业务功能之间的解耦,这个博主之前有写过,可自行查看使用方法。

Java开发 - AOP初体验

Aspects

Aspects 模块提供了 Spring与Aspect的集成,是一个面向切面编程的模块。而AOP是Aspect Oriented Programming的简称,这就是A的由来。

Instrumentation

Instrumentation 模块在应用中提供了对 Instrumntation 支持和类加载器的实现。这个和没说一样啊,Instrumntation是动态编程的代名词,特别是在Java SE6中,其被赋予了更多的功能,具有了更强的动态控制、解释能力、也增加了动态添加 class path 的功能。

Instrumentation 的最大作用,就是类定义动态改变和操作。在 Java SE 5 及其后续版本当中,开发者可以在一个普通 Java 程序(带有 main 函数的 Java 类)运行时,通过 –javaagent 参数指定一个特定的 jar 文件(包含 Instrumentation 代理)来启动 Instrumentation 的代理程序。

推荐一篇Java探针的博客:Java探针技术:Instrumentation

我们现在使用的框架很多都是已经帮我们做过了,以至于我们根本不了解更底层的东西,所谓成也风云,败也风云,这样也不知道是幸?还是不幸 ?

Messaging

Messaging模块为 STOMP ( Simple Text Orientated Messaging Protocol ,简单文本定向消息协议)提供了支持,主要用于应用程序中 WebSocket 子协议的实现,同时,Messaging 模块可通过注解的方式来选择和处理来自 WebSocket 客户端的 STOMP 消息。

Test

Test模块用于对JUnit等岑氏框架的支持,以实现Spring代码的自动化测试功能。

Spring核心包

编号包名说明
1

Spring Core

Spring 的核心工具包

2

Spring Beans

Spring oC 的实现,通过 XML 配置文件或注解的方式实现

Spring Bean 的管理

3

Spring Context

Spring 上下文环境,用于 Bean 关系的管理和维护等

4

Spring Aspects

Spring对Aspect框架的整合和支持

5

Spring Context Support

Spring Context 的扩展支持,用于 MVC 方面功能的支持

6        

Spring Expression Language

Spring 表达式语言

7

Spring Framework Bom

处理不同的项目依赖了不同版本的 Spring引起的版本冲突问

8

Spring lnstrument

Spring 针对服务器的代理接口

9

Spring lnstrument Tomcat

Spring 针对 Tomcat 的集成

10

Spring JDBC

Spring 针对 JDBC 的封装

11

Spring JMS

Spring 为简化JMS API 的使用而做的封装

12

Spring Messaging

Spring 集成 Messaging API 和消息协议

13

Spring ORM

Spring 整合第三方的 ORM 的实现,如 Hibemate、MyBatis、

JDO及Spring的JPA

14

Spring OXM

Spring Object/XML 映射的支符,可以让 Spring在Java

与XML之间方便地切换

15

Spring Test 

Spring 对Junit 等测试框架的支持

16

Spring TX

Spring 为JDBC、Hibemate、JDO、JPA 等提供的一致的声明

式事务管理和编程式事务管理

17

Spring Web

基于 Spring 构建Web 应用开发所需的核心类,包括自动载入

WebApplicationContcxt、Struts与JSF集成、文件上传、 Filter

类和其他辅助工具类

18

Spring WebMVC 

包含 Spring MVC 框架相关的所有类,例如国际化、标签、

Theme 、视图展现的 FreeMarker、JasperReports、Tiles

Velocity、 XSLT 相关类。当然,如果你的应用使用了独立的

MVC 框架,则不需要使用这个 JAR 文件里的任何类

19

Spring WebMVC Portlet 

基于 Portlet 环境的 Spring MVC 的增强

Spring常用注解

分类注解说明
Bean声明

@Cornponent

定义基础层的通用组件,没有明确的角色

@Service 

定义业务逻辑层的服务组件

@Repository 

在数据访问层定义数据资源服务

@Controller 

在展现层使用,用于定义控制器

Bean注入

@Autowired

服务依赖注入,一般用于注入 @Cornponent、@Service 定义的组件

@Resource

服务依赖注入,一般用于注入@Repository 定义的组件

配置类注解

@Configuration

声明该类为配置类,其中@Value 属性可以直接和配置文件属性映射

@Bean 

注解在方法上,卢明该方法的返回值为一个 Bean实例

@ComponentScan

用于对 Component 进行扫描配置

AOP 注解

@EnableAspectJAutoProxy 

开启 Spring对AspectJ代理的支持

@Aspect 

声明一个切面 ,使用 @After、@Before、@Around

定义通知 (Advice ),可直接将拦截规则(切点)作为参数

@After 

在方法执行之后执行

@Before

在方法执行之前执行

@Around 

在方法执行之前和之后都执行

@PointCut

声明一个切点

@Bean属性支持注解

@Scope

设置 Spring 容器 Bean 实例的生命周期 取值有singleton、prototype、request、session、和 global session 

@PoslConstruct

声明方法在构造函数执行完之后开始执行

@PreDestroy

声明方法在 Bean销毁之前执行

@Value 

为属性注入值

@PropertySource 

声明和加载配置文件

异步操作注解

@EnableAsync

声明在类上,开启对异步任务的支持

@Async 

声明方法是一个异步任务, Spring 后台基于线程池

异步执行该方法

定时任务注解

@EnableScheduling

声明在调度类上,开启对任务调度的支持

@Scheduled

声明一个定时任务,包括 cron、fïxDelay、fixRate

等参数

开启功能支持注解

@EnableAspectJAutoProxy 

开启对 AspectJ自动代理的支持

@EnableAsync 

开启对异步方法的支持

@EnableScheduling 

开启对计划任务的支持

@EnableWebMVC

开启对 WebMVC 的配置支持

@EnableConfigurationProperties 

开启对@ConfígurationPropertes 注解配置 Bean支持

@EnableJpaRepositories

开启对 SpringDataJPARepository 的支持

@EnableTransactionManagement 

开启对事务的支持

@EnableCaching 

开启对缓存的支持

测试注解

@RunWith

运行器, Spring 中通常用于对Junit支持

@ContextConfiguration

用来加载配置 ApplicationContext ,其中 classes属性用来加载配置类

Spring MVC注解

@Controller

声明该类为 Spring MVC 中的控制器

@RequestMapping

用于声明映射 Web 请求的地址和参数,包括访问

路径和参数

@ResponseBody 

支持将返回值放在 Response Body 体中返回,通常

用于返回 JSON 数据到前瑞

@RequestBody 

允许 Request 的参数在 Request Body 体中

@PathVariable

用于接收基于路径的参数,通常作为 RESTful 接口的实现

@RestController 

组合注解,相当于 @Controller和@ResponseBody

的组合

@ExceptionHandler

用于全局控制器的异常处理

@InitBinder 

WebDataBinder用来自动绑定前台请求的参数到模型中

Spring IoC的原理

IoC作用

Spring 通过一个配置文件描述 Bean Bean 之间的依赖关系,利用 Java 的反射功能实例化 Bean 并建立Bean之间的依赖关系,Spring IoC 容器在完成这些底层操作的基础上,还提供了 Bean 实例缓存管理、 Bean 生命周期管理、 Bean 实例代理、事件发布和资源装载等高级服务。

Spring Bean作用域

Singleton (单例)

单例模式下,IoC容器只会存在一个共享的Bean实例,但在多线程下,它是不安全的,会发生竞争。配置如下:

<bean id="xxxxDao" class="com.xxxxxx.xxxxxximpl" scope="singleton"/>

Prototype (原型)

原型模式下,每次通过 Spring 容器获取 Prototype 定义的 Bean 时,容器都会重新创建一个新的Bean实例。和单例的区别是,单例的Bean是无状态的,原型的Bean有状态。配置如下:

<bean id="xxxxService" class="com.xxxxxx.xxxxxxService" scope="prototype"/>

Request (请求级别)

请求级别模式下,一个HTTP请求容器只返回该Bean的同一个实例,不同的HTTP请求,容器会创建新的Bean,Bean随着HTTP请求的结束而销毁。配置如下:

<bean id="xxxxRequest" class="com.xxxxxx.xxxxxxLogin" scope="request"/>

Session (会话级别)

Session 指在一次 HTTP Session 中容器会返回该 Bean 的同一个实例,而对不同的Session 请求则会创建新的 Bean 实例,不同的Bean实例不共享数据,请求结束,Bean实例销毁。配置如下:

<bean id="xxxxSession" class="com.xxxxxx.xxxxxxSession" scope="session"/>

Global Session (全局会话)

Global Session 指在一个全局的 HTTP Session容器会返问该 Bean 的同一个实例,且仅在使用 Portlet Context 时有效。配置如下:

<bean id="xxxxSession" class="com.xxxxxx.xxxxxxSession" scope="globalSession"/>

Spring Bean的生命周期

  1. 实例化一个bean;
  2. 按照 Spring 上下文对实例化的 Bean 进行配置;
  3. 如果这个 Bean 实现了 BeanNameAware 接口 ,则调用它实现的 setBeanName(String)方法,该方法传递的参数是 spring 配置文件中Bean的id值;
  4. 如果这个 Bean 实现了 BeanNameAware 接口 ,则调用它实现的 setBeanFactory(BeanFactory)方法,该方法传递的参数是Spring工厂本身;
  5. 如果这个 Bean 实现了 ApplicationContextAware 接口 ,则调用它实现的setApplicationContext(ApplicationContext) 方法,该方法传入的参数是Spring上下文;
  6. 如果该 Bean 关联了 BeanPostProcessor 接口, 会调用 postProcessBeforeInitialization(Object obj , String s) 方法,该方法在 Bean 初始化前调用,常用于定义初始化Bean 的前置工作,比如系统缓存的初始化;
  7. 如果Bean在Spring 配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法;
  8. 如果某个 Bean 关联了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization(Object obj, String s) 方法。至此, Bean 的初始化工作就完成了,应用程序就可以开始使用Bean实例了;
  9. 当 Bean 不再被需要时, 会在清理阶段被清理掉。如果 Bean 实现了DisposableBean 接口,则 Spring 会在退出前调用实现类的 destroy()方法;
  10. 如果某个 Bean的Spring 配置文件中配置了 destroy-method 属性,在 Bean 被销毁前会自动调用其配置的销毁方法。

Spring Bean的依赖注入

  • 构造器注入
  • set方法注入
  • 静态工厂注入
  • 实例工厂注入

以上几种在开发中都比较常见,注入!博客认为更像是赋值,大家品一下。

Spring的自动装配

有自动装配就有手动装配,手动装配包括基于 XML的装配(构造方法、 set 方法等)。自动装配包括5种专配方式,均可以用来引导 Spring 容器自动完成依赖注入,具体如下:

  • no: 关闭自动装配,通过显式设置 ref 属性来进行对象装配;
  • byName: 通过参数名自动装配, Bean 的autowire 被设置为 byName后, Spring 容器试图匹配并装配与该 Bean 的属性具有相同名字 Bean;
  • byType: 通过参数类自动装配, Bean的autowire 被设 byType 后,Spring 容器试图匹配并装配与该 Bean 的属性具有相同类型的 Bean;
  • constructor:通过设置构造器参数的方式来装配对象,如果没有匹配到带参数构造器参数类型, Spring会抛出异常;
  • autodetect: 首先尝试使用constructor 来自动装配 ,如果无法完自动装配 ,则使用byType方式进行装配。

Spring AOP的原理

关于AOP的介绍和代码案例都在这里了:Java开发 - AOP初体验

Spring MVC原理

Spring MVC中的MVC即模型-视图-控制器,该框架围绕 DispatcherServlet 设计,把请求分发给各个处理器,并支持可配置的处理器映射和视图渲染等功能。其详细流程如下:

  • 客户端发起HTTP 请求:客户端将请求提交到 DispatcherServlet;
  • 寻找处理器:DispatcherServlet,控制器查询一个或多 HandlerMapping,找到处理该请求的 Controller;
  • 调用处理器:DispatcherServlet将请求提交到 Controller;
  • 调用业务处理逻辑并返回结果:Controller调用业务处理逻辑后,返回ModelAndView
  • 处理视图映射并返回模型:DispatcherServlet 查询一个或多个ViewResoler视图解析器,找到 ModelAndView 指定的视图;
  • HTTP响应:视图负责将结果在客户端浏览器上渲染和展示。

Spring Boot

相较于Spring,Spring Boot是一个全新的项目,目的是为了简化Spring的初始搭建以及开发过程,使得开发人员不需要再定义样板化的配置。通过这种方式,Spring Boot成为了快速开发的代名词。其有如下特点:

独立运行Spring项目

Spring Boot可以以jar包的方式独立运行,通过命令“ java–jar xx.jar”,创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs。

内嵌Servlet容器

Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。

简化Maven配置

Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置,如: spring-boot-starter-redis、spring-boot-starter-data-mongodb 和 spring-boot-starter-data-elasticsearch等。

自动配置Spring

Spring Boot 提供了大量的默认自动配置来简化项目的开发,开发人员也通过配置文件修改默认配置,这种尽可能自动配置Spring容器的方式,可以说是开发者的福音。

自带应用监控

提供生产就绪功能,如指标、健康检查和外部配置等。

无代码生成和XML配置

创建好的Spring Boot项没有额外代码生成,也没有XLM相关的配置,你甚至在项目中找不到XML文件。

事务

关于事务和分布式事务,博主在下面这篇博客中讲解的很清楚了:

Java开发 - 分布式事务详解

MyBatis

MyBatis的缓存分为一级缓存和二级缓存,在默认情况下,一级缓存是开启的,而且不能被关闭的。

  • 一级缓存指SqlSession级别的缓存,当在同一个 SqlSession 中执行相同的 SQL语句查询时将查询结果集缓存,第二次以后的查询不会从数据库中查询,而是直接从缓存中获取,一级缓存最多能缓存1024条SQL语句;
  • 二级缓存指跨SqlSession的缓存,即Mapper级别的缓存。在Mapper级别的缓内,不痛的SqlSess ion缓存可共享。

一级缓存原理

客户端发出一个SQL查询语句时,MyBatis执行SQL查询并将查询到的数据存储到SqlSession一级缓存中,当第二次相同的SQL语句来查询时,将直接从SqlSession一级缓存中取出值返回。一级缓存使用的数据结构是Map,其key为Mapperld+Offset+Limit+SQL+所有的入参。

这里要注意,当出现Commit操作,即增删改操作时,MyBatis认为数据发生了变了,会将一级缓存中的数据全部清空。下次有SQL查询时将继续缓存,即使之前有缓存过,但在commit后也会被全部清空。

二级缓存原理

二级缓存是Mapper级别的,Mapper以命名空间为单位创建缓存数据结构,数据结构也是Map类型,其key为Mapperld+Offset+Limit+SQL+所有的入参,和一级缓存规则是一样的。MyBatis二级缓存是通过CacheExecutol实现的,CacheExecutor是Executor的代理对象。MyBatis接收到用户的查询请求时,首先会根据Map的Key在CacheExecutor中查询数据是否存在,不存在则前往数据库中查询。

开启 级缓存需要做以下配置

  • 在 MyBatis 全局配置中启用二级缓存配置;
  • 在对应的 Mapper. xml 配置 Cache节点;
  • 在对应的select 查询节点中添加 useCache=true。

说实话,还真没用过,缓存我们一般都会利用Redis,有更大的内存和更高的并发,实在没有使用这个的必要。

Spring生态

Spring是一个开放的平台,在其上可以集成其他组件的功能,Spring的生态做的也还是不错的,我们常用的有Spring Data、Spring Security、Spring AMQP等,详细可查看下面的链接:

Spring Framework

结语

这里只是粗浅的介绍了Spring中有哪些东西,能把这些东西搞懂也算是差不多了吧。哈哈,其实“差不多”这个词挺害人的,但能掌握多少,掌握到什么程度,就是大家自己的事情了,内容不少,大家可以有针对性的去看去学,像里面有些东西博主都是一笔带过,不是说不重要,只是没有想象中那么重要,要是有时间,可以深入研究,那今天就到这里吧,博主也需要拐回去好好再看几遍。 

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

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

相关文章

重定向:电商行业打败对手的杀手锏

重定向是一种在线营销策略&#xff0c;针对对产品或服务表示兴趣的潜在客户。可以追踪那些访问过您的网站、但未进行过消费的用户&#xff0c;再次向他们展示相关产品&#xff0c;激起消费欲。再营销则是可以追踪那些将商品加入网页购物车&#xff0c;但最后没有购买的用户&…

物流RFID设备一般在哪些场景应用?

随着现代物流行业的快速发展&#xff0c;传统条码技术信息量少&#xff0c;易脏污损毁&#xff0c;耐用性不高等问题很难满足物流企业多样化的需求&#xff0c;物流RFID设备的应用也越来越广泛。下面我们就跟大家一起来分析一下&#xff0c;物流RFID设备可以在哪些场景中应用。…

计算机体系结构基础知识介绍之动态调度(三)

首先回顾一下tomasulo算法&#xff0c; Tomasulo算法的第一个优点是分布式的冒险检测逻辑&#xff0c;这是通过使用预留站和公共数据总线实现的。预留站是一种存储指令和操作数的缓冲区&#xff0c;每个功能单元都有自己的预留站。公共数据总线是一种广播结果的方式&#xff0…

SpringBoot07:Thymeleaf模板引擎

目录 一、Thymeleaf 1、模板引擎 2、引入Thymeleaf 3、Thymeleaf分析 二、测试 1、编写一个TestController 2、编写一个测试页面welcome.html放在templates目录下 3、启动项目请求测试 三、Thymeleaf语法学习 1、修改测试请求&#xff0c;增加数据传输 2、要使用thy…

zabbix服务部署

文章目录 zabbix1 zabbix简介1.1 组成部件1.2 监控原理1.3 Zabbix 6.0新特性1.4 Zabbix6.0功能组件1.4.1 Zabbix Server1.4.2 数据库1.4.3 Web界面1.4.4 Zabbix Agent1.4.5 Zabbix Proxy1.4.6 Java Gateway 2 部署zabbix服务端2.1 部署Nginx2.2 安装PHP2.3 修改Nginx配置2.4 修…

Docker安装ElasticSearch7.14.0 docker安装elasticsearch7.14.0完整详细教程

Docker安装ElasticSearch7.14 docker安装elasticsearch7.14完整详细教程 Docker 上安装 ElasticSearch 7.14.0 的步骤&#xff1a;选择要安装的ElasticSearch 版本1、拉取 ElasticSearch 镜像2、创建并运行容器关闭容器启动容器重启容器 3、elasticsearch常用端口以及作用4、测…

耳夹式骨传导耳机测评!2023年最全耳夹骨传导耳机盘点

现在市面上的骨传导耳机品牌层出不穷&#xff0c;骨传导耳机好不好用&#xff0c;主要还是看耳机的品牌背景以及独家的音质技术调配&#xff0c;较大的骨传导耳机品牌在购买时售后以及使用体验上都具有一定的保障&#xff0c;下面就分享一些值得入手的骨传导耳机给大家吧~ 第一…

安装.net framework3.5 无法打开运行空间池,服务器管理器winRM插件可能已经损坏

解决方案&#xff1a; 1.以管理员权限打开命令提示符&#xff0c;然后运行如下命令&#xff1a; "reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f" 2.然后运行"winrm quickco…

玩转 TypeScript 中【class类】的定义与使用方法解读。

目录 类的概念类的继承 &#xff1a;类的存取器&#xff1a;类的静态方法与静态属性&#xff1a;类的修饰符&#xff1a;参数属性&#xff1a;抽象类&#xff1a;类的类型: 类的概念 类是用于创建对象的模板。他们用代码封装数据以处理该数据。JavaScript 中的类建立在原型上&a…

java.lang.NoSuchMethodError异常原因及解决办法

java.lang.NoSuchMethodError异常原因及解决办法 第一种简单的情况就是本类中需要调用的方法名称错误&#xff0c;这种情况就需要去检查方法名称是否正确&#xff0c;避免调用的方法和本类中的有相同的名称。 第二种情况就是jar包的问题 可能是jar包没有导入进来或者jar包导入…

HTTP第17讲——Cookie机制

Cookie的诞生背景 HTTP 是“无状态”的&#xff0c;这既是优点也是缺点。优点是服务器没有状态差异&#xff0c;可以很容易地组成集群&#xff0c;而缺点就是无法支持需要记录状态的事务操作。 后来发明的 Cookie 技术&#xff0c;给 HTTP 增加了“记忆能力”。 什么是Cookie…

图灵奖得主Geoffrey Hinton:我的五十年深度学习生涯与研究心法

本文介绍了Hinton非常坦诚地分享了自己的学术生涯&#xff0c;深度学习的未来和研究心得。 他从未正式上过计算机课程&#xff0c;本科在剑桥大学读的是生理学和物理学&#xff0c;期间曾转向哲学&#xff0c;但最终拿到的却是心理学方向的学士学位&#xff1b;他曾因为一度厌学…

在OK3588的Ubuntu系统上安装Firefox浏览器

文章目录 概要配置上网环境安装的具体命令 概要 因为Ubuntu系统里面没有安装浏览器&#xff0c;为了方便使用&#xff0c;提高工作效率&#xff0c;我们安装一下Firefox浏览器。 Firefox是一款适用于Ubuntu系统的免费和开源的Web浏览器。由Mozilla Foundation和其子公司Mozil…

818. 数组排序

链接&#xff1a; 链接 题目&#xff1a; 给定一个长度为 nn 的数组 aa 以及两个整数 ll 和 rr&#xff0c;请你编写一个函数&#xff0c;void sort(int a[], int l, int r)&#xff0c;将 a[l]∼a[r]a[l]∼a[r] 从小到大排序。 输出排好序的数组 aa。 输入格式 第一行包含三个…

TiDB简述及TiKV的数据结构与存储 | 京东物流技术团队

1 概述 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品&#xff0c;具备水平扩容或者缩容、金融级高可用、实时 HTAP、…

景区导航小程序解决方案-便捷化游览体验

系统背景 景区导航小程序是一种基于移动设备的智能化导航系统&#xff0c;旨在为游客提供更加便捷、准确的导航服务。随着人们生活水平的提高&#xff0c;旅游业得到了快速发展&#xff0c;然而&#xff0c;在景区游览过程中&#xff0c;游客往往需要花费大量时间和精力来寻找…

Java- IO 及其相关面试题

目录 一、前言二、Java IO 概述输入和输出流2.1.1 定义2.1.2 代码示例 2.2 字节流和字符流2.2.1 定义2.2.2 代码示例 2.3 标准IO和NIO 三、字节流和字符流3.1. 字节流&#xff1a;InputStream和OutputStream3.1.1. FileInputStream和FileOutputStream3.1.2. ByteArrayInputStre…

【unity之IMGUI实践】单例模式管理面板对象【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

30页PPT,IPv6技术一次梳理清

上午好&#xff0c;我的网工朋友。 IPv6技术在以前的文章里&#xff0c;已经被老杨总说的很明白了&#xff1a;《都到2023年了&#xff0c;为啥IPv6还一直无法普及&#xff1f; 》 但是IPv6的过渡技术&#xff0c;好像一直没给你补上。 你知道IPv4向IPv6过渡的步骤有哪些吗&…

在B1中定义一个纯虚函数pvf(),重做练习1-4,并解释其结果

运行代码&#xff1a; //在B1中定义一个纯虚函数pvf()&#xff0c;重做练习1-4&#xff0c;并解释其结果。 #include"std_lib_facilities.h" //---------------------------------------------------------------------- //定义B1类。 class B1 { public:virtual vo…