2
class ConfigurationDetails {
    private @Resource String esHostURL;
    private @Resource int maxMessageCounter;
    private @Resource String queueName;
   // Assume : This class has all getter and setter methods and a default constructor
}

另一个班级

public class SpringMessageListener implements MessageListener {
    @Resource ConfigurationDetails configDetails; // With getter and setter method for this
............
..........

在我的 XML

<bean id="aListener" class="com.vzw.es.cosumer.SpringMessageListener" autowire="byName"/>
<bean id="configDetails" class="com.vzw.es.pojo.ConfigurationDetails"  autowire="byName">
    <property name="esHostURL" value="http://obsgracstg-db0.odc.vzwcorp.com:9200"/>
    <property name="maxMessageCounter" value="500"/>
    <property name="queueName" value="ES_queue"/>
</bean>

现在,当我调试代码并看到 SpringMessageListerner 类中的 configDetails 显示为 null 时,具有 id configDetails 的 bean 没有自动装配含义。但是当我明确执行 appContext.getBean("configDetails") 时,它给了我非空对象。

为什么自动装配不起作用?我错过了什么吗?

4

1 回答 1

2

默认情况下,Spring 不会查找@Autowired@Resource@Inject注释来自动装配您的 bean。你需要告诉它寻找他们

<context:component-scan base-package="com.yourpackage.some" />
// or, in this case, <context:annotation-config />

这样,Spring 将扫描包中的类并注入存在@Autowiredor的 bean @Resource

不要忘记添加命名空间声明

xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">

更重要的是

class ConfigurationDetails {
    private @Resource String esHostURL;
    private @Resource int maxMessageCounter;
    private @Resource String queueName;
   // Assume : This class has all getter and setter methods and a default constructor
}

尽管您可以自动装配Stringint键入,但这通常被认为是不好的做法。而是删除@Resource此处的注释并为每个字段添加 getter 和 setter。

声明中的property元素<bean>负责设置这些字段。

于 2013-09-09T20:09:54.913 回答