需求场景:
假设存在微服A,微服B,微服C三个微服务,这三个微服务都需要使用Redis客户端,在使用时,我们需要为每个微服务配置一个
RedisConfig
类,而该配置类有些时候是一样的,并没有因为服务不同而产生差异,那么假如我三个服务都要使用Redis,那这是三个微服务都将需要配置一遍RedisConfig
,这就造成了代码的冗余
- 解决方案
使用@Import
注解
例:
1.提取一个公共模块,用于存放实体类,工具类,配置类
例:
2.在api-commos
模块中,创建RedisConfig
类
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* @Description: reids配置类
*/
@Configuration
public class RedisConfig {
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer); // key的序列化类型
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value的序列化类型
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
3.导入该木块的依赖
4.在服务A,服务B, 服务C的启动类上分别引入该配置类
@Import({
com.wf.apicommons.config.RedisConfig.class
})
public class UserManagementApplication {
public static void main(String[] args) {
SpringApplication.run(UserManagementApplication.class, args);
log.info("服务A");
}
}
//解决引入spring注入的工具类,无法找到的错误
@Import({
com.wf.apicommons.config.RedisConfig.class
})
public class MessageBoardApplication {
public static void main(String[] args) {
SpringApplication.run(MessageBoardApplication.class, args);
log.info("服务B");
}
}