2013-06-27 39 views
4

我试图诠释了一套方法如下:@Autowired任何方法名称与任意数量的参数

package com.spring.examples; 
public class MyBean 
{ 
    private String name; 
    private int age; 

    @Autowired 
    public void set(String name, int age) 
    { 
     this.name = name; 
     this.age = age; 
    } 
} 

配置文件:

<bean id="myBean" class="com.spring.examples.MyBean"> 
    <property name="name" value="Marie" /> 
    <property name="age" value="101" /> 
</bean> 

我得到这个错误:

No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies

如何配置此bean以正确调用set方法?

+4

对于这两个变量,您应该有两个不同的setters和getters。 – Jacopofar

回答

10

对具有任意数量参数的方法使用@Autowired即可。唯一的问题是应用程序上下文必须能够识别你想为每个参数注入什么。

错误消息中的抱怨很明显:您的应用程序上下文中没有定义唯一的String bean。

为您的特定示例中的解决方案是使用@Value标注为每个参数:

@Autowired 
set(@Value("${user.name:anonymous}") String name, @Value("${user.age:30}") int age) 

这将使使用您的上下文定义的PropertyPlaceholderConfigurer来解决这些属性,并会回落到所提供的默认值如果这些属性没有定义。

如果要注入被定义为在上下文豆的对象,你只需要确保只有一个匹配的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或其他)或@Service或其他任何形式的刻板印刷你的班级,然后只使用<context:component-scan/>;这将消除需要在XML中声明每个单独的bean。

+0

+1喜欢你的详细解答。从中学到了一点。 – Bart

+0

其实,我的配置文件不止于此。在学习春天的同时,我正在记笔记,并用每个概念的例子来练习。现在我开始注解,并且陷入了设置方法。谢谢你的帮助。 – JoseA

+0

为了继续我的学习,我在此期间解决了这个问题: – JoseA

0

您也可以定义StringInteger豆这样的:

<bean id="name" class="java.lang.String"> 
    <constructor-arg value="Marie"/> 
</bean> 

<bean id="age" class="java.lang.Integer"> 
    <constructor-arg value="101"/> 
</bean> 

但我觉得这很奇怪这样一个简单的例子。正如评论中所建议的那样,我会选择两个安装人员:

package com.spring.examples; 
public class MyBean 
{ 
    private String name; 
    private int age; 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    public void setAge(int age) 
    { 
     this.age = age; 
    } 
} 
相关问题