Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于springbean与另一个函数的参数具有相同类型和不同参数的混淆_Java_Spring Boot - Fatal编程技术网

Java 关于springbean与另一个函数的参数具有相同类型和不同参数的混淆

Java 关于springbean与另一个函数的参数具有相同类型和不同参数的混淆,java,spring-boot,Java,Spring Boot,为了定制LettuceConnectionFactory,我创建了两个函数,它们具有相同的返回类型和不同的参数,一个是单节点配置,另一个是集群配置。守则如下: @Component @Configuration public class RedisConfig { @Bean(name = "singleFactory") public LettuceConnectionFactory createSingleFactory(RedisSingleConfig redisSin

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

@Component
@Configuration
public class RedisConfig {

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

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

}
@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"));
}
调用它们时,返回值(LettuceConnectionFactory)是另一个函数的参数。守则如下:

@Component
@Configuration
public class RedisConfig {

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

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

}
@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"));
}
@Autowired
私有RedisActivityClusterConfig testConfig;
@自动连线
私有RedisItemConfig RedisItemConfig;
@自动连线
私有RedisConfig RedisConfig;
@自动连线
私有StringRedisTemplate-redisTemplate;
@试验
公开无效测试(){
redisTemplate.setConnectionFactory(redisConfig.createClusterFactory(testConfig));
ValueOperations-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、端口和池策略。我最初的想法是,通过将redisConfig_A、redisConfig_B、redisConfig_C等参数注入不同的redisConfig,动态生成不同的LettuceConnectionFactories(配置可以通过参考资料中的redis.properties获得),然后使用这些LettuceConnectionFactories创建定制的RedisTemplates。我的困惑是这些objs:RedisConfig、LettuceConnectionFactories是否可以自动连接?我尝试了很多方法,但都不起作用…

您需要创建自己的自定义
RedisTemplate
,否则默认的方法将尝试自动连接默认的
RedisConnectionFactory
,从而导致您的错误

@Component
@Configuration
public class RedisConfig {

    @Bean(name = "redisTemplateA")
    public RedisTemplate<String, Object> redisTemplateA(RedisClusterConfig redisClusterConfigA) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(createClusterFactoryA(redisClusterConfigA));
        return template;
    }

    @Primary
    @Bean(name = "singleFactoryA")
    public LettuceConnectionFactory createSingleFactoryA(RedisSingleConfig redisSingleConfigA){...}

    @Bean(name = "clusterFactoryA")
    public LettuceConnectionFactory createClusterFactoryA(RedisClusterConfig redisClusterConfigA){...}

    // other combinations as needed
}
@组件
@配置
公共类RedisConfig{
@Bean(name=“redisTemplateA”)
公共RedisTemplate redisTemplateA(RedisClusterConfig redisClusterConfigA){
RedisTemplate=新RedisTemplate();
setConnectionFactory(createClusterFactoryA(redisClusterConfigA));
返回模板;
}
@初级的
@Bean(name=“singleFactoryA”)
公共LettuceConnectionFactory createSingleFactoryA(RedisSingleConfig redisSingleConfigA){…}
@Bean(name=“clusterFactoryA”)
公共LettuceConnectionFactory createClusterFactoryA(RedisClusterConfig redisClusterConfigA){…}
//其他需要的组合
}
然后在测试中使用此
RedisTemplate
。更多详情/示例

Extra您不能传递动态配置,因为正如您前面的问题所述,您必须将
LettuceConnectionFactory
作为bean,而不是基本初始化。因此,您需要为每个配置定义
LettuceConnectionFactories
的所有组合,例如
singleFactoryA
(使用
configA
)、
clusterFactoryB
(使用
configB
),然后只需使用所需的配置+工厂组合创建多个
RedisTemplate
。总是使用不同的bean名称,这应该是可行的


如果您需要所有的组合,那么您可以将所有这些
RedisTemplate
存储到一些
表中,其中键将是配置类型(
A
B
C
)和工厂类型(
single
cluster
),其值本身作为模板
Table redisTemplateTable
,其中我刚刚假设
ConfigType
FactoryType
作为您的自定义枚举类,
@Autowired
注释告诉
Spring
注入点在哪里(即需要发生注入的地方)。在找到这样的注入点时,
Spring
尝试找到同一类型的已配置bean(通过
@bean
配置),如果找到这样的bean,则将其注入注入点


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

异常与我的另一个问题相同。[我已经尝试了你上面提到的方法,很抱歉它不起作用。我对这个问题做了更详细的补充。一个问题,让我们假设有ClassA,它有两个子类:ClassB和ClassC。这些子类是bean,而ClassA不是bean。让我们也假设一些函数期望ClassA对象作为参数t、 在这种情况下会发生错误吗?换句话说,是否可以自动连线并将ClassB或ClassC对象传递给该函数,而不是ClassA对象是的,这是您描述的方式。但对于普通的自动连线定义,Spring只需要一个。即,您必须只有ClassB实例或ClassC实例。如果您有这两个实例,则Autowired必须指定名称属性。