springboot 多模块工程 @EnableCaching在引入的模块中不生效 求大佬们给点思路和解决办法

我这边的用的maven,A工程为persist模块(entity dao service),负责和db交互读写数据,B工程是restful接口工程,引入了A,在B的启动类上加了@EnableCaching注解,B中测试@Cacheable(value = {"test"}, key="#root.methodName")注解能生效,但是在A工程中的service中的接口加@Cacheable不生效,每次都会查db不走缓存。

@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Resource
    private LettuceConnectionFactory lettuceConnectionFactory;

    @Bean
    @SuppressWarnings("unchecked")
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisSerializer<String> stringSerializer = new StringRedisSerializer();
        RedisSerializer<Object> jsonString = new FastJsonRedisSerializer<>(Object.class);

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);

        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(jsonString);

        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(jsonString);
        return redisTemplate;
    }

    /**
     * 配置CacheManager
     *
     * @return
     */
    @Bean
    public CacheManager cacheManager(LettuceConnectionFactory factory) {
        // 配置序列化(缓存默认有效期 5分钟)
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5));
        RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        // 以锁写入的方式创建RedisCacheWriter对象
        //RedisCacheWriter writer = RedisCacheWriter.lockingRedisCacheWriter(factory);
        // 创建默认缓存配置对象
        /* 默认配置,设置缓存有效期 1小时*/
        //RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1));
        /* 自定义配置test:demo 的超时时间为 5分钟*/
        RedisCacheManager cacheManager = RedisCacheManager
                .builder(RedisCacheWriter.lockingRedisCacheWriter(factory))
                .cacheDefaults(redisCacheConfiguration)
                //.withInitialCacheConfigurations(singletonMap(CacheConstant.TEST_DEMO_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)).disableCachingNullValues()))
                .transactionAware().build();
        return cacheManager;
    }

}

redis配置

spring:
    # 环境 dev|test|prod
    profiles:
        active: dev
    http:
        multipart:
          servlet:
            max-file-size: 100MB
            max-request-size: 100MB
            enabled: true
    redis:
        database: 0
#        host: r-wz9ocbby3w7260l8kjpd.redis.rds.aliyuncs.com
        host: localhost
        port: 6379
#        password: '@#Mech-van'     # 密码(默认为空)
        timeout: 10000  # 连接超时时长(毫秒)
        lettuce:
          pool:
            max-active: 8   #最大连接数据库连接数,设 0 为没有限制
            max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
            max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
            min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
          shutdown-timeout: 100ms
    cache:
      redis:
        cache-null-values: false
        use-key-prefix: true
        time-to-live: 60s

检查下pom.xml的配置
https://blog.csdn.net/weixin_38750084/article/details/83628886

根据你的描述来看,pom依赖应该没问题,B项目能生效。这里要明白缓存注解生效的本质是对你的注解类做了代理,首先确认spring扫描有没有包含A工程(B工程上的@ConponentScan(com.demo.B)改为@ConponentScan(com.demo),向上一级。既然是引入A能正常启动,那应该是扫描到了的),再看你的注解是打在接口上的,这块我没试过,我通常用在controller上的,你可以试试在serviceImpl类对应的方法上加一下试试。

确实有这个问题,引入的module不起作用.解决了吗?

已解决 bean加载顺序的问题. 在new对象创建bean时 该对象使用

@Autowired 引用其它bean 该bean所有涉及的缓存失效,包括内部引用的.