0

我尝试使用 MyClass 扩展 PropertyPlaceholderConfigurer,并通过 Prop1 的 Autowired 注释和 Prop2 的基于 XML 的注释注入属性。Prop2 按预期工作,而 Prop1 为空。我下面的代码有问题吗?

<context:component-scan base-package="com.jchips12.test" />

<bean id="prop1" class="com.jchips12.test.Prop1">
    <property name="name" value="Prop1" />
</bean>

<bean id="myClass" class="com.jchips12.test.MyClass">
    <property name="prop2">
        <bean class="com.jchips12.test.Prop2">
            <property name="name" value="Prop2" />
        </bean>
    </property>
    <property name="location" value="classpath:environment.properties" />
</bean>

MyClass.java

public class MyClass extends PropertyPlaceholderConfigurer{

    @Autowired
    private Prop1 prop1;
    private Prop2 prop2;

    public void setProp2(Prop2 prop2) {
        this.prop2 = prop2;
    }

    ...

}

道具 1 和道具 2

public class Prop1 {

    private String name;

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

}

public class Prop2 {

    private String name;

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

}
4

1 回答 1

1

由于MyClassBeanFactoryPostProcessor,它在 bean 生命周期的早期就完全实例化,以便能够对创建的 bean 定义进行操作。@Autowired另一方面,注释由 AutoWiredAnnotationPostProcessor 处理,它是一个BeanPostProcessor

现在由于MyClass更早地完全实例化,因此AutowiredAnnotationPostProcessor无法对其进行操作并注入 prop1 依赖项,因此失败。最好BeanFactoryPostProcessor通过显式配置本身注入 a 的所有属性。

编辑:@Autowired 的javadoc也有很好的解释 - http://static.springsource.org/spring/docs/3.2.x/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html

于 2013-07-26T10:39:00.870 回答