| | |
| | | import org.springframework.boot.web.servlet.FilterRegistrationBean; |
| | | import org.springframework.context.ApplicationContext; |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.context.annotation.Primary; |
| | | import org.springframework.data.redis.cache.BatchStrategies; |
| | | import org.springframework.data.redis.cache.RedisCacheConfiguration; |
| | |
| | | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
| | | import org.springframework.web.servlet.mvc.method.RequestMappingInfo; |
| | | import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; |
| | | import org.springframework.web.util.pattern.PathPattern; |
| | | |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | | |
| | | @AutoConfiguration |
| | | @ConditionalOnProperty(prefix = "yudao.tenant", value = "enable", matchIfMissing = true) // 允许使用 yudao.tenant.enable=false 禁用多租户 |
| | |
| | | * |
| | | * @return 忽略租户的 URL 集合 |
| | | */ |
| | | @SuppressWarnings("removal") |
| | | private Set<String> getTenantIgnoreUrls() { |
| | | Set<String> ignoreUrls = new HashSet<>(); |
| | | // 获得接口对应的 HandlerMethod 集合 |
| | |
| | | continue; |
| | | } |
| | | // 添加到忽略的 URL 中 |
| | | ignoreUrls.addAll(entry.getKey().getPatternValues()); |
| | | if (entry.getKey().getPatternsCondition() != null) { |
| | | ignoreUrls.addAll(entry.getKey().getPatternsCondition().getPatterns()); |
| | | } |
| | | if (entry.getKey().getPathPatternsCondition() != null) { |
| | | ignoreUrls.addAll( |
| | | convertList(entry.getKey().getPathPatternsCondition().getPatterns(), PathPattern::getPatternString)); |
| | | } |
| | | } |
| | | return ignoreUrls; |
| | | } |
| | | |
| | | // ========== MQ ========== |
| | | |
| | | @Bean |
| | | public TenantRedisMessageInterceptor tenantRedisMessageInterceptor() { |
| | | return new TenantRedisMessageInterceptor(); |
| | | @Configuration(proxyBeanMethods = false) |
| | | @ConditionalOnClass(name = "cn.iocoder.yudao.framework.mq.redis.core.interceptor.RedisMessageInterceptor") |
| | | public static class TenantRedisMQConfiguration { |
| | | |
| | | @Bean |
| | | public TenantRedisMessageInterceptor tenantRedisMessageInterceptor() { |
| | | return new TenantRedisMessageInterceptor(); |
| | | } |
| | | |
| | | } |
| | | |
| | | @Bean |
| | | @Configuration(proxyBeanMethods = false) |
| | | @ConditionalOnClass(name = "org.springframework.amqp.rabbit.core.RabbitTemplate") |
| | | public TenantRabbitMQInitializer tenantRabbitMQInitializer() { |
| | | return new TenantRabbitMQInitializer(); |
| | | public static class TenantRabbitMQConfiguration { |
| | | |
| | | @Bean |
| | | public TenantRabbitMQInitializer tenantRabbitMQInitializer() { |
| | | return new TenantRabbitMQInitializer(); |
| | | } |
| | | |
| | | } |
| | | |
| | | @Bean |
| | | @Configuration(proxyBeanMethods = false) |
| | | @ConditionalOnClass(name = "org.apache.rocketmq.spring.core.RocketMQTemplate") |
| | | public TenantRocketMQInitializer tenantRocketMQInitializer() { |
| | | return new TenantRocketMQInitializer(); |
| | | } |
| | | public static class TenantRocketMQConfiguration { |
| | | |
| | | // ========== Job ========== |
| | | @Bean |
| | | public TenantRocketMQInitializer tenantRocketMQInitializer() { |
| | | return new TenantRocketMQInitializer(); |
| | | } |
| | | |
| | | @Bean |
| | | public TenantJobAspect tenantJobAspect(TenantFrameworkService tenantFrameworkService) { |
| | | return new TenantJobAspect(tenantFrameworkService); |
| | | } |
| | | |
| | | // ========== Redis ========== |
| | |
| | | RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, |
| | | BatchStrategies.scan(yudaoCacheProperties.getRedisScanBatchSize())); |
| | | // 创建 TenantRedisCacheManager 对象 |
| | | return new TenantRedisCacheManager(cacheWriter, redisCacheConfiguration, tenantProperties.getIgnoreCaches()); |
| | | TenantRedisCacheManager cacheManager = new TenantRedisCacheManager(cacheWriter, redisCacheConfiguration, |
| | | tenantProperties.getIgnoreCaches()); |
| | | // 开启事务感知:@Transactional 方法内的 @CacheEvict / @CachePut 自动延迟到 afterCommit, |
| | | // 避免事务未提交就清缓存被并发读穿写脏值;无事务时立即生效,行为不变 |
| | | cacheManager.setTransactionAware(true); |
| | | return cacheManager; |
| | | } |
| | | |
| | | // ========== Job ========== |
| | | |
| | | @Configuration(proxyBeanMethods = false) |
| | | @ConditionalOnClass(name = "cn.iocoder.yudao.framework.quartz.core.handler.JobHandler") |
| | | public static class TenantJobConfiguration { |
| | | |
| | | @Bean |
| | | public TenantJobAspect tenantJobAspect(TenantFrameworkService tenantFrameworkService) { |
| | | return new TenantJobAspect(tenantFrameworkService); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |