可以@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”。
最后一点,这种用法@Autowired
最适合构造函数,因为在构造对象后很少需要将属性设置为大容量。
编辑:
写完答案后,我注意到了您的 XML 配置;这是完全没用的。如果您想使用注释,只需定义没有任何属性的 bean 并确保您<context:annotation-config/>
在上下文中的某处声明:
<context:annotation-config/>
<bean id="myBean" class="com.spring.examples.MyBean"/>
<!-- no properties needed since the annotations will be automatically detected and acted upon -->
这样,容器将检测到需要注入的所有内容并采取相应措施。XML<property/>
元素只能用于调用 java bean setter(只接受一个参数)。
@Component
此外,您可以使用诸如(或其他)之类的刻板印象来注释您的类,@Service
然后只需使用<context:component-scan/>
; 这将消除在 XML 中声明每个单独的 bean 的需要。