gpt4 book ai didi

java - 如何在 spring 框架中 @Autowired 一个 List

转载 作者:搜寻专家 更新时间:2023-11-01 01:25:08 35 4
gpt4 key购买 nike

我有一个配置类如下:

@Configuration
public class ListConfiguration {
@Bean
public List<Integer> list() {
List<Integer> ints = new ArrayList<>();
ints.add(1);
ints.add(2);
ints.add(3);
return ints;
}

@Bean
public int number() {
return 4;
}
}

我还有一个测试类如下

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = ListConfiguration.class)
public class ListTest {
@Autowired
List<Integer> ints;

@Test
public void print() {
System.out.println(ints.size());
System.out.println(ints);
}
}

但是print方法的输出是1[4],为什么不是3[1,2,3]?非常感谢您的帮助!

最佳答案

你有一个 Integer 类型的 bean和一个 List<Integer> 类型的 bean在您的应用程序上下文中。

现在显然你想要 Autowiring 的 bean 是 List<Integer> 类型的,它确实有资格作为 Autowiring 的候选者。为了发现 Spring 实际上是如何 Autowiring 字段的,我不得不深入研究 AutowiredAnnotationBeanPostProcessor。类。

TL;我调查的 DR 是 Spring 更喜欢按以下顺序 Autowiring 对象:

  1. 使用 @Value 的默认值
  2. 使用类型参数的多个 bean。
  3. 与字段类型匹配的单个 bean。

这意味着如果你正在 Autowiring 一个 List<Integer> Spring 将尝试 Autowiring 多个 Integer在尝试 Autowiring 单个 List<Integer> 之前将 beans 放入列表中 bean 。

您可以在 DefaultListableBeanFactory 中看到此行为类(class)。

相关片段如下:

public Object doResolveDependency(DependencyDescriptor descriptor, String beanName,
Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException {

Class<?> type = descriptor.getDependencyType();
//Searches for an @Value annotation and
Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);
if (value != null) {
//Handle finding, building and returning default value
}
/*
* Check for multiple beans of given type. Because a bean is returned here,
* Spring autowires the Integer bean instance.
*/
Object multipleBeans = resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter);
if (multipleBeans != null) {
return multipleBeans;
}
InjectionPoint previousInjectionPoint = ConstructorResolver.setCurrentInjectionPoint(descriptor);
try {
Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);
// Do more stuff here to try and narrow down to a single instance to autowire.
}
}

希望这能解释为什么您确实需要使用 @Qualifer当您在应用程序上下文中拥有该类型的单个 bean 时尝试 Autowiring 该类型列表时的注释。

编辑:值得注意的是,这不是好的做法。创建基元集合或基元包装器并将其注册为 bean 会导致问题。最好的方法是使用 @Value并在 Spring 获取的属性文件中定义原语列表。

例子:

应用程序.properties 文件

list=1,2,3,4

在您的配置类中声明以下 bean:

@Bean 
public ConversionService conversionService() {
return new DefaultConversionService();
}

默认转换服务用于将属性文件中声明的逗号分隔值转换为类型安全的对象集合。

使用它的类:

@Value("${list}")
private List<Integer> anotherList;

anotherList将包含 1,2,3 & 4 作为列表中的元素。

关于java - 如何在 spring 框架中 @Autowired 一个 List<Integer>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39653206/

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