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必须指定名称属性。