6

我正在尝试如下注释 set 方法:

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>

我收到了这个错误:

没有为依赖找到 [java.lang.String] 类型的合格 bean:预计至少有 1 个合格的 bean

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

4

2 回答 2

10

可以@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 的需要。

于 2013-06-27T21:28:02.490 回答
0

You can also define String and Integer beans like this:

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

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

But i think this is weird for such a simple case. I would go for two setters instead, as suggested in the comments:

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;
    }
}
于 2013-06-29T13:53:50.340 回答