品牌型号:联想ThinkPad X1
系统:Windows10家庭版
软件版本:Spring 5.3.7
做Spring项目久了,有两块东西绕不开,一个是AOP,一个是缓存。AOP能帮我们把日志、权限、事务这些逻辑从业务代码里剥离出来,缓存则是应对接口性能瓶颈最直接的手段。但很多人对这两块的掌握停留在"能用"的程度,AOP就用注解,缓存就加@Cacheable,至于背后怎么实现的、有哪些方式可选,反而说不太清楚。下面就给大家介绍一下Spring实现AOP的几种方式,Spring缓存有哪些技术的相关内容。
一、Spring实现AOP的几种方式
Spring AOP常用的是注解方式,经常用到@Aspect配合@Before、@After、@Around这些通知注解来实现,先定义一个切面类,在类上添加@Aspect和@Component,用切点表达式指定要拦截的方法范围,逻辑写在对应的通知方法里就行。这种方式代码直观,项目里用得很多。

也可以基于XML配置实现AOP,Spring早期项目里比较常见,在XML里用

我们还能手动实现MethodInterceptor接口,通过编程方式创建代理,这种方式灵活度高,但写起来麻烦,适合需要动态决定是否代理、或者代理逻辑比较特殊的场景,一般业务开发用不上,框架层或者中间件开发里偶尔会用到。

还有一种是Spring提供的ProxyFactoryBean,直接在配置里声明代理工厂,指定目标对象和拦截器,手动控制代理的生成,属于偏底层的用法,现在项目里几乎看不到了。实际开发中,我们用注解方式覆盖了大多数场景,剩下的情况通常也能用@Aspect解决,其他方式更多是作为备选或者理解Spring AOP底层机制的切入点。
二、Spring缓存有哪些技术
Spring本身就提供了一套缓存抽象,提供了@Cacheable、@CachePut、@CacheEvict这几个注解。@Cacheable用得很多,方法执行前先查缓存,有结果直接返回,没有才执行方法并把结果存进去。而@CacheEvict负责的是清缓存,在数据更新或删除时使用。

比较简单的是Spring自带的ConcurrentMapCache,基于JVM内存,不需要任何额外配置,引入Spring Boot就能用,这种很适合开发环境或者那种数据量小、不需要持久化的场景,但应用重启缓存就没了,多实例部署时无法实现缓存共享,生产环境基本不会单独用它。

生产环境用得更多的还是Redis,Spring Boot集成Redis做缓存很成熟,引入spring-boot-starter-data-redis,配置一下连接信息,再把缓存管理器换成RedisCacheManager就行。Redis支持数据持久化、支持集群、多实例之间共享缓存没有问题,过期时间也可以灵活配置,应对大多数业务缓存场景肯定够用。

除了Redis,Caffeine也值得提一下,它是一个纯本地缓存库,性能高,读写速度比Redis快很多,因为少了网络开销,比较适合那种数据量不大、更新不频繁但读取极其频繁的场景。比如配置信息、字典数据这类,实际项目里可以考虑用本地Caffeine做一级缓存,Redis做二级缓存,先查本地再查远程。

以上就是Spring实现AOP的几种方式,Spring缓存有哪些技术的全部内容了。AOP的几种实现方式里,注解方式是日常开发的主力,其他方式了解原理就够,真正用到的机会不多。核心是理解切面逻辑怎么织入进去的,出了问题才能快速排查出原因。缓存这块选型思路可以这么参考:本地开发或者简单场景用默认实现,生产环境上用Redis,对性能要求高的热点数据可以考虑加一层Caffeine。