在具有任意数量参数的方法上使用@Autowired是可以的.唯一的问题是应用程序上下文必须能够识别您要为每个参数注入的内容.
错误消息中的投诉使得这一点非常清楚:您没有在应用程序上下文中定义的唯一String bean.
您的特定示例的解决方案是为每个参数使用@Value注释:
@Autowired
set(@Value("${user.name:anonymous}") String name, @Value("${user.age:30}") int age)
这将使用在您的上下文中定义的PropertyPlaceholderConfigurer来解析这些属性,如果未定义这些属性,它将回退到提供的默认值.
如果要在上下文中注入定义为bean的对象,则只需确保每个参数只有一个匹配的bean:
@Autowired
set(SomeUniqueService myService, @Qualifier("aParticularBean") SomeBean someBean)
在上面的示例中,假设应用程序上下文中只有一个SomeUniqueService实例,但可能有几个SomeBean实例 – 但是,其中只有一个将具有bean id“aParticularBean”.
最后要注意的是,@ Aututired的这种用法最适合构造函数,因为很少需要在构造对象后将属性设置为bulk.
编辑:
在写完答案之后我注意到了你的XML配置;它完全没用.如果要使用注释,只需定义没有任何属性的bean,并确保声明< context:annotation-config />在你的上下文的某个地方:
这样,容器将检测需要注入的所有内容并相应地采取相应措施. XML< property /> element只能用于调用java bean setters(只接受一个参数).
此外,您可以使用@Component(或@Service或其他)等构造型来注释您的类,然后只使用< context:component-scan /> ;;这将消除在XML中声明每个单独bean的需要.