From c994e7296081a76a09d8b8710289fe56192ba23d Mon Sep 17 00:00:00 2001 From: Toyas Date: Sat, 29 Mar 2025 20:50:57 +0800 Subject: [PATCH] chore(config): Improve MyBatis Plus and Redis conditional configuration --- docs/video-common模块实现步骤和代码.md | 34 ++++++++++++------- .../common/config/MybatisPlusConfig.java | 10 +++++- .../nuaa/video/common/config/RedisConfig.java | 8 +++-- .../main/resources/META-INF/spring.factories | 1 - 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/docs/video-common模块实现步骤和代码.md b/docs/video-common模块实现步骤和代码.md index 3170741..722810f 100644 --- a/docs/video-common模块实现步骤和代码.md +++ b/docs/video-common模块实现步骤和代码.md @@ -991,6 +991,7 @@ public class MinioUtils { // com.nuaa.video.common.config.RedisConfig.java package com.nuaa.video.common.config; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; @@ -1011,6 +1012,7 @@ import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator /** * Redis配置类 + * 只有在存在RedisOperations类且没有redisTemplate bean时才会创建 */ @Configuration @EnableCaching @@ -1020,26 +1022,27 @@ public class RedisConfig { @Bean @ConditionalOnMissingBean(name = "redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + @ConditionalOnBean(RedisConnectionFactory.class) // 只有当存在RedisConnectionFactory时才创建 + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(redisConnectionFactory); - + template.setConnectionFactory(factory); + // 创建配置好的ObjectMapper ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); - + // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值 Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(mapper, Object.class); - + // 使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(serializer); - + // Hash的key也采用StringRedisSerializer的序列化方式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(serializer); - + template.afterPropertiesSet(); return template; } @@ -1108,31 +1111,38 @@ import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerIntercep import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; +import javax.sql.DataSource; + /** * MyBatis Plus配置类 + * 只有在存在DataSource且启用mybatis-plus时才生效 */ @Configuration @EnableTransactionManagement -@MapperScan("com.nuaa.video.**.mapper") +@ConditionalOnClass({DataSource.class}) +@ConditionalOnProperty(prefix = "spring.datasource", name = "url") +@MapperScan({"com.nuaa.video.**.mapper"}) public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - + // 分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); - + // 防止全表更新与删除插件 interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); - + // 乐观锁插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); - + return interceptor; } } diff --git a/video-common/src/main/java/com/nuaa/video/common/config/MybatisPlusConfig.java b/video-common/src/main/java/com/nuaa/video/common/config/MybatisPlusConfig.java index 1a34016..1e1653b 100644 --- a/video-common/src/main/java/com/nuaa/video/common/config/MybatisPlusConfig.java +++ b/video-common/src/main/java/com/nuaa/video/common/config/MybatisPlusConfig.java @@ -1,3 +1,4 @@ +// com.nuaa.video.common.config.MybatisPlusConfig.java package com.nuaa.video.common.config; import com.baomidou.mybatisplus.annotation.DbType; @@ -6,16 +7,23 @@ import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerIntercep import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; +import javax.sql.DataSource; + /** * MyBatis Plus配置类 + * 只有在存在DataSource且启用mybatis-plus时才生效 */ @Configuration @EnableTransactionManagement -@MapperScan("com.nuaa.video.**.mapper") +@ConditionalOnClass({DataSource.class}) +@ConditionalOnProperty(prefix = "spring.datasource", name = "url") +@MapperScan({"com.nuaa.video.**.mapper"}) public class MybatisPlusConfig { @Bean diff --git a/video-common/src/main/java/com/nuaa/video/common/config/RedisConfig.java b/video-common/src/main/java/com/nuaa/video/common/config/RedisConfig.java index 027b47e..aa5d414 100644 --- a/video-common/src/main/java/com/nuaa/video/common/config/RedisConfig.java +++ b/video-common/src/main/java/com/nuaa/video/common/config/RedisConfig.java @@ -1,5 +1,7 @@ +// com.nuaa.video.common.config.RedisConfig.java package com.nuaa.video.common.config; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; @@ -20,6 +22,7 @@ import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator /** * Redis配置类 + * 只有在存在RedisOperations类且没有redisTemplate bean时才会创建 */ @Configuration @EnableCaching @@ -29,9 +32,10 @@ public class RedisConfig { @Bean @ConditionalOnMissingBean(name = "redisTemplate") - public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + @ConditionalOnBean(RedisConnectionFactory.class) // 只有当存在RedisConnectionFactory时才创建 + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(redisConnectionFactory); + template.setConnectionFactory(factory); // 创建配置好的ObjectMapper ObjectMapper mapper = new ObjectMapper(); diff --git a/video-common/src/main/resources/META-INF/spring.factories b/video-common/src/main/resources/META-INF/spring.factories index 4f0ad8c..3e670f2 100644 --- a/video-common/src/main/resources/META-INF/spring.factories +++ b/video-common/src/main/resources/META-INF/spring.factories @@ -1,6 +1,5 @@ # src/main/resources/META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -com.nuaa.video.common.config.RedisConfig,\ com.nuaa.video.common.config.MybatisPlusConfig,\ com.nuaa.video.common.config.MinioConfig,\ com.nuaa.video.common.config.WebConfig,\