Spring自动挂载列表

时间:2011-06-07 14:53:13

标签: spring list autowired

是否可以将@Autowired与列表一起使用?

就像我有mimetypes的属性文件一样,在我的类文件中我有类似的东西

@Autowired
private List<String> mimeTypes = new ArrayList<String>();

6 个答案:

答案 0 :(得分:40)

Spring 4支持自动收集给定类型的所有bean并将它们注入到集合或数组中的能力。

示例:

@Component
public class Car implements Vehicle {
}

@Component
public class Bus implements Vehicle {
}

@Component
public class User {
   @Autowired
   List<Vehicle> vehicles;//contains car and bus
}

参考:Spring 4 Ordering Autowired Collections

答案 1 :(得分:33)

不鼓励

@Qualifier(".."),而是尝试使用

按名称自动装配
private @Resource(name="..") List<Strings> mimeTypes;

另见How to autowire factorybean

答案 2 :(得分:10)

您甚至可以在spring .xml中创建java.util.List并通过@Qualifier将其注入您的应用程序。来自泉源http://static.springsource.org/spring/docs/current/reference/xsd-config.html

 <!-- creates a java.util.List instance with the supplied values -->
 <util:list id="emails">
   <value>pechorin@hero.org</value>
   <value>raskolnikov@slums.org</value>
   <value>stavrogin@gov.org</value>
   <value>porfiry@gov.org</value>
 </util:list>

所以这会改变你的布线:

 @Autowired
 @Qualifier("emails")
 private List<String> mimeTypes = new ArrayList<String>();

我会建议这种方法,因为无论如何你都要注入一个字符串列表。

喝彩!

<强> 修改

如果要注入属性,请查看此How can I inject a property value into a Spring Bean which was configured using annotations?

答案 3 :(得分:1)

我认为你至少需要一个限定词。对“new”的调用似乎与使用Spring的想法背道而驰。你对Spring的角色很困惑。如果你调用“new”,那么该对象不受Spring的控制。

答案 4 :(得分:0)

如果autowired bean在同一个(@Configuration)类中声明,并且您需要它来声明另一个bean,那么以下工作:

@Bean
public BeanWithMimeTypes beanWithMimeTypes() {
    return new BeanWithMimeTypes(mimeTypes());
}

@Bean
public List<String> mimeTypes() {
    return Arrays.<String>asList("text/html", "application/json);
}

当然,即使您在另一个配置中覆盖mimeTypes bean,它也能正常运行。无需明确的@Qualifier@Resource注释。

答案 5 :(得分:-1)

只要列表是bean,您就应该能够自动装配它。然后,您可以使用@Qualifier告诉Spring使用哪个bean /列表。见http://static.springsource.org/spring/docs/3.0.x/reference/beans.html#beans-autowired-annotation-qualifiers