gpt4 book ai didi

java - Spring如何找到匹配的bean?

转载 作者:行者123 更新时间:2023-12-01 09:15:24 25 4
gpt4 key购买 nike

我声明了bean,例如RedisTemplate<Long, Permission> , RedisTemplate<Long, Order> ,在Redis配置中。代码如下所示,

@Bean
public RedisTemplate<String, Order> orderRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Order> redisTemplate = new RedisTemplate<>();
configure(redisTemplate, redisConnectionFactory);
return redisTemplate;
}

@Bean
public RedisTemplate<String, Permission> permissionRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Permission> redisTemplate = new RedisTemplate<>();
configure(redisTemplate, redisConnectionFactory);
return redisTemplate;
}

默认情况下,声明的名称就是声明的方法的名称。现在,我编写了一个测试代码,在 TestController 中声明了一个带注释 @Autowired 的文件。测试代码如下:

@Autowired
RedisTemplate<String, Permission> permissionTemplate;

然后,我访问了 TestController。效果很好。但是,我在测试中有一个问题。Spring如何找到RedisConfiguration中声明的Bean并赋值给permissionTemplate字段?众所周知,泛型类型已在 Java 编译时被删除,所以 Spring 不可能通过泛型类型找到正确的 Bean。下一个可能是Spring通过filedName找到声明的Bean。为了批准我的建议,我修改了TestController中的文件,如下。

@Autowired
RedisTemplate<String, Permission> orderTemplate;

然后,我请求了 TestController。它也工作得很好。测试表明Spring使用Generic Type来查找匹配的Bean。

Spring如何知道permissionTemplate的泛型类型?

最佳答案

是的,Java 泛型存在类型删除,但在很多情况下,泛型类型信息仍然存在于字节码中,例如字段、返回类型和方法参数。 Spring使用这些信息来确定泛型类型信息,从而进行bean类型匹配。

演示运行时可用的通用信息:

import java.lang.reflect.*;
public class Foo {
private List<String> fooField;

public static void main(String[] args) throws Exception{
for (Field f : Foo.class.getDeclaredFields()) {
if (f.getName().equals("fooField")) {
System.out.println("Generic Types " + f.getGenericType());
break;
}
}
}
}

您应该看到输出:

Generic Types java.util.List<java.lang.String>

关于java - Spring如何找到匹配的bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40582048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com