Spring源码深度解析(第2版)

  • 更新时间:
  • 3375人关注
  • 点击下载

这是一个不错的Spring类学习资源,由养雪娟提供,主要知识点是关于Spring、Spring源码、深度解析、Spring的内容,已被539人关注,同类资源中评分为8.4分。

Spring源码深度解析(第2版)从核心实现、企业应用和Spring Boot这3个方面,由浅入深、由易到难地对Spring源码展开了系统的讲解,包括Spring 整体架构和环境搭建、容器的基本实现、默认标签的解析、自定义标签的解析、bean的加载、容器的功能扩展、AOP、数据库连接JDBC、整合MyBatis、事务、SpringMVC、远程服务、Spring消息、Spring Boot体系原理等内容。

Spring源码深度解析(第2版)不仅介绍了使用Spring框架开发项目必须掌握的核心概念,还指导读者使用Spring框架编写企业级应用,并针对在编写代码的过程中如何优化代码、如何使得代码高效给出了切实可行的建议,从而帮助读者全面提升实战能力。 语言简洁,示例丰富,可帮助读者迅速掌握使用Spring进行开发所需的各种技能。

本书适合于已具有一定Java编程基础的读者,以及在Java平台下进行各类软件开发的开发人员、测试人员等。

目录

  • 第1部分 核心实现
  • 第1章 Spring整体架构和环境搭建2
  • 第2章 容器的基本实现19
  • 第3章 默认标签的解析44
  • 第4章 自定义标签的解析77
  • 第5章 bean的加载86
  • 第6章 容器的功能扩展137
  • 第7章 AOP175
  • 第2部分 企业应用
  • 第8章 数据库连接JDBC222
  • 第9章 整合MyBatis239
  • 第10章 事务262
  • 第11章 SpringMVC298
  • 第12章 远程服务347
  • 第13章 Spring消息374
  • 第3部分 Spring Boot
  • 第14章 Spring Boot体系原理394
精选笔记:SpringCache 分布式缓存的实现方法(规避redis解锁的问题)

21小时5分钟前回答

简介

spring 从3.1 开始定义

  •  org.springframework.cache.Cache
  • org.springframework.cache.CacheManager

来统一不同的缓存技术
并支持使用JCache(JSR-107)注解简化我们的开发

基础概念

实战使用

整合SpringCache简化缓存开发

常用注解

常用注解 说明
@CacheEvict 触发将数据从缓存删除的操作 (失效模式)
@CachePut 不影响方法执行更新缓存
@Caching 组合以上多个操作
@CacheConfig 在类级别共享缓存的相同配置
@Cacheable 触发将数据保存到缓存的操作

方法

1)、开启缓存功能 @EnableCaching
2)、只需要使用注解就能完成缓存操作

1、引入依赖

spring-boot-starter-cache、spring-boot-starter-data-redis
配合redis使用

<!-- 引入 redis-->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
 <!-- 排除 lettuce -->
 <exclusions>
  <exclusion>
   <groupId>io.lettuce</groupId>
   <artifactId>lettuce-core</artifactId>
  </exclusion>
 </exclusions>
</dependency>

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2、写配置

在项目新建config文件夹,新建一个config类

代码如下:

@EnableConfigurationProperties(CacheProperties.class)//为configuration容器中放参数
@EnableCaching
@Configuration
public class MyCacheConfig {

 /**
  * 配置文件中的内容不再生效(全部走自定义配置)
  * @param cacheProperties
  * @return
  */
 @Bean
 RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){
  RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();

  config= config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
  config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

  CacheProperties.Redis redisProperties = cacheProperties.getRedis();

  if (redisProperties.getTimeToLive() != null) {
   config = config.entryTtl(redisProperties.getTimeToLive());
  }

  if (redisProperties.getKeyPrefix() != null) {
   config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());
  }

  if (!redisProperties.isCacheNullValues()) {
   config = config.disableCachingNullValues();
  }

  if (!redisProperties.isUseKeyPrefix()) {
   config = config.disableKeyPrefix();
  }

  return config;

 }
}
(1)、自动配置写了哪些
  CacheAutoConfiguration 会导入 RedisAutoConfiguration
  自动配置好缓存管理器RedisCacheManager
  (2)、配置使用redis做为缓存
  spring.cache.typeredis

3、修改pom 配置

spring:
 cache:
 type: redis
 redis:
  # 缓存过期时间
  time-to-live: 60000
  # 如果制定了前缀,我们就是用指定的前缀,如果没有我们就默认使用缓存的名字作为前缀
  key-prefix: CACHE_
  # 是否使用前缀
  use-key-prefix: true
  # 是否把缓存空值,防止缓存穿透
  cache-null-values: true

4、原理

 1、每一个要缓存的数据 我们都来指定要放到那个名字的缓存【缓存的分区(按照业务类型)】
 2、@cacheable({"category"})
  代表当前方法的结果需要缓存,如果缓存中,方法不用调用
  如果缓存中没有,会调用方法,最后将方法的结果放入缓存
 3、默认行为
  1)、如果缓存中有,方法不用调用
  2)、key默认自动生成:缓存的名字::SimpleKey[] (自主生成的key值)
  3)、缓存的value的值。默认使用jdk序列化机制,将序列化后的数据存到redis
  4)、默认 ttl 时间 -1 (永不过期)


  自定义:
  1)、指定生成的缓存使用的key: key属性制定,接受一个SpEL
   SpEL(详见文档)
  2)、指定缓存的数据的存活时间:配置文件中修改 ttl
  3)、将数据保存为 json 格式:
    自定义 RedisCacheConfiguration即可

失效模式:@CacheEvict

原理:变更缓存的时候会将redis中的缓存删除
(当下次查询时,会重新载入缓存)

推荐使用@CacheEvict

同时进行多种缓存操作 @Caching指定删除某个分区下的所有数据
@CacheEvict(value=“category”,allEntries=true)存储统一类型的数据,都可以指定成同一个分区。分区名默认就是缓存的前缀

类中使用:@CacheEvict(value=“category”,allEntries=true)
配置中使用:(禁用前缀 + 默认前缀)
spring.cache.redis.use-key-prefix=true

双写模式:@CachePut

原理:在变更缓存时,删除原有的缓存,然后将新数据重新插入到缓存中

到此这篇关于SpringCache 分布式缓存(规避redis解锁的问题)的文章就介绍到这了,更多相关SpringCache 分布式缓存内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!

相关声明:

Spring源码深度解析(第2版)下载资源由用户 尹明亮 于 2021-10-02 10:37:05 分享至百度网盘。仅供想学习Spring的网友交流使用,专题参考:Spring,

相关资源

  • Spring Boot实战派

    Spring Boot实战派

    版本点新:针对Spring Boot 2.0及以上版本 体例科学:用知识点+实例形式编写 实例丰富:58个基础实例 + 2个综合项目 对比选优:对比讲解多种同类技术,便于技术选型,如,Spring Security和Shiro、Elasticsearch和Solr、JPA和Mybatis。 技术点新:讲解了时下流行的接口架构风格RESTful、用来实现高并发的Redis、以及用来实现系统间通信的中间件RabbitMQ。 《Spring Boot实战派》针对Spring Boot 2.0及以上版本,采用知识

    大小:55 MBSpring Boot

    立即下载
  • Spring Boot2 教程

    Spring Boot2 教程

    Spring Boot2 教程 简介 Spring Boot2.0.6和Spring Security5.0.9讲解了Spring Security安全框架,包括基于内存的认证和角色授权、基于MySQL的认证和权限控制、基于URL的动态权限控制。适合于有Sprig Boot基础的学员。 nbsp; 目录 1、基于内存的认证和角色授权。 2、基于MySQL的认证和权限控制。 3、基于URL的动态权限控制。 4、自定义Filter/动态权限刷新

    大小:8 MBSpringBoot

    立即下载
  • Spring MVC+MyBatis开发从入门到项目实战

    Spring MVC+MyBatis开发从入门到项目实战

    工作经验多:千万浏览量时尚博主倾囊相授,陪你走入Web开发设计的各个方面。 初学者:从简易的示例学起,慢慢深层次技术性关键。 內容全:包含SpringMVC与MyBatis的33个方法,56个案例。 重实

    大小:230.8 MBSpring MVC开发

    立即下载
  • 《Spring学习指南(第3版)》源码资源

    《Spring学习指南(第3版)》源码资源

    编辑推荐 本书是Spring 框架的入门指南,全书系统、全面地介绍了Spring 框架的设计思想和模块构成,并针对各个模块给出了相应的应用场景和源代码示例,旨在帮助Java 开发人员快速掌握Spring 框架的用法。 本书适合有一定Java 基础的读者或者初级开发人员学习,也可供欲了解Spring 框架功能的资深开发人员参考,还可用作相关培训机构的教程。 ★ Spring 框架基础; ★ 依赖注入; ★ bean 的配置、自定义bean 和bean 定义; ★ Spring Web MVC 基础知识以及其

    大小:1.22 MBSpring

    立即下载
  • Spring MVC学习指南(第2版)

    Spring MVC学习指南(第2版)

    Spring MVC学习指南第2版重在讲述如何通过Spring MVC来开发基于Java的Web应用。分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC

    大小:83.3 MBSpring

    立即下载

学习笔记

11小时24分钟前回答

Redis在springboot中的使用教程

依赖如下: dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId/dependency 配置文件如下: spring:redis: open: true # 是否开启redis缓存 true开启 false关闭 database: 0 host: 47.104.208.124 port: 6378 password: lf.1228 # 密码(默认为空) timeout: 6000 # 连接超时时长(毫秒) pool: max-active: 1000 # 连接池最大连接数(使用负值表示没有限制) max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-idle: 10 # 连接池中的最大空闲连接 min-idle: 5 # 连接池中的最小空闲连接 RedisConfig类: @Configurationpublic class RedisConfig { @Autowired private RedisConnectionFactory factory; @Bean public RedisTemplateString, Object redisTemplate() { R……

12小时22分钟前回答

SpringBoot如何动态改变日志级别

前言 关于日志级别,大部分项目可能都设置为info级别,当然也可能有一些追求性能或者说包含很多敏感信息的项目直接将级别设置为warn或者error;这时候如果项目中出现一些未知异常,需要用到很详细的日志信息,此时如果项目中没有动态改变日志级别的机制,排查问题将很棘手。 日志系统 我们常用的一些日志系统包括:Log4j2、Logback、Java Util Logging;我们想动态改变日志的级别,前提是这些日志系统都支持我们直接设置日志等级,当然这些系统提供了很简单的接口; Log4j2 LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);LoggerConfig loggerConfig = loggerContext.getConfiguration().getLoggers().get("root");logger……