1. @ConditionalOnProperty 根据配置加载不同的 bean
场景:对 redis 配置进行封装,实现自动化配置,能兼容哨兵模式和集群模式。
想到在 redis 配置中加一个 redis.type 来区分集群和哨兵模式(redis.type=cluster 或 sentinel),然后根据 type 来分别加载 JedisConnectionFactory、RedisClusterConfiguration、RedisSentinelConfiguration
配置如下:但是一直不成功,报没有 JedisConnectionFactory 这个 bean
@ConditionalOnProperty(name = "redis.type", havingValue = "cluster") @ConditionalOnMissingBean @Bean public RedisClusterConfiguration redisClusterConfiguration() { List<RedisNode> nodeList = new ArrayList<>(); String[] cNodes = hostName.split(","); //分割出集群节点 for (String node : cNodes) { String[] hp = node.split(":"); nodeList.add(new RedisNode(hp[0], Integer.parseInt(hp[1]))); } RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(); redisClusterConfiguration.setClusterNodes(nodeList); redisClusterConfiguration.setMaxRedirects(maxRedirects); return redisClusterConfiguration; } @ConditionalOnProperty(name = "redis.type", havingValue = "cluster") @ConditionalOnMissingBean @Bean public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig, RedisClusterConfiguration redisClusterConfiguration) { JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration, jedisPoolConfig); jedisConnectionFactory.setTimeout(timeout); jedisConnectionFactory.setPassword(password); return jedisConnectionFactory; } @ConditionalOnProperty(name = "redis.type", havingValue = "sentinel") @ConditionalOnMissingBean @Bean public RedisSentinelConfiguration redisSentinelConfiguration() { Set<String> sentinelHostAndPorts = Sets.newHashSet(Splitter.on(",").split(hostName).iterator()); RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(masterName, sentinelHostAndPorts); return redisSentinelConfiguration; } @ConditionalOnProperty(name = "redis.type", havingValue = "sentinel") @ConditionalOnMissingBean @Bean public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig, RedisSentinelConfiguration redisSentinelConfiguration) { JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisSentinelConfiguration, jedisPoolConfig); jedisConnectionFactory.setTimeout(timeout); jedisConnectionFactory.setPassword(password); return jedisConnectionFactory; }