java - 关于与另一个函数的参数具有相同类型和不同参数的 spring bean 的混淆

标签 java spring-boot

为了自定义LettuceConnectionFactory,我创建了两个函数,它们具有相同的返回类型和不同的参数,一个是单节点配置,另一个是集群配置。代码如下:

@Component
@Configuration
public class RedisConfig {

    @Bean(name = "singleFactory")
    public LettuceConnectionFactory createSingleFactory(RedisSingleConfig redisSingleConfig){...}

    @Bean(name = "clusterFactory")
    public LettuceConnectionFactory createClusterFactory(RedisClusterConfig redisClusterConfig){...}

}

当它们被调用时,返回值(LettuceConnectionFactory)是另一个函数的参数。代码如下:

@Autowired
private RedisActivityClusterConfig testConfig;

@Autowired
private RedisItemConfig redisItemConfig;

@Autowired
private RedisConfig redisConfig;

@Autowired
private StringRedisTemplate redisTemplate;

@Test
public void test(){
    redisTemplate.setConnectionFactory(redisConfig.createClusterFactory(testConfig));
    ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
    System.out.println(valueOperations.get("test"));
}

但是这样,spring会报告没有可用的'org.springframework.data.redis.connection.RedisConnectionFactory'类型的合格bean:预期单个匹配bean,但发现2:singleFactory,clusterFactory


添加问题:

由于项目稍微复杂一些,有很多个redis单机服务器A、B、C...和集群服务器A、B、C...,并且它们有不同的ip、端口和池策略。我最初的想法是,通过注入(inject)不同的redisConfig作为参数,例如RedisConfig_A,RedisConfig_B,RedisConfig_C(配置可以通过资源中的redis.properties获取)来动态生成不同的LettuceConnectionFactories,然后使用这些LettuceConnectionFactories创建自定义的RedisTemplates。我的困惑是,这些对象:RedisConfig、LettuceConnectionFactories 是否可以 Autowiring ?尝试了很多方法,还是不行...

最佳答案

@Autowired 注解告诉 Spring 注入(inject)点在哪里(即需要发生注入(inject)的位置)。在找到这样的注入(inject)点时,Spring会尝试查找相同类型的已配置bean(通过@Bean配置),如果找到这样的bean,则会将其注入(inject)到注入(inject)中观点。

如果它找到两个或更多这样的bean,它将抛出异常。为了避免异常,我们必须使用@Qualifier注释。

关于java - 关于与另一个函数的参数具有相同类型和不同参数的 spring bean 的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53130086/

相关文章:

java - 使用 POI 读取 .xlsm 和 .xlsx 时出现异常

java - Hibernate validator 不起作用

spring - 使用 spring.factories 加载自定义自动配置时出现 FileNotFoundException

java - 隐藏字段值空白 Thymeleaf

java - 自动从 JTable 中的特定列获取所有 ID(即不必选择行)

spring-boot - 来自触发器的异常映射 - spring-boot 2.4.x + jOOQ

java - 将 Spring Boot 1.5.8 迁移到 2.1.5 -- Gradle 问题

java - 尝试连接到远程 MySQL 数据库时出现 PacketTooBigException

java - 限制不可变对象(immutable对象)Java中的可变对象

java - 带有 Spring 引导的“访问控制允许来源”