为什么BeanDefinition.getPropertyValues返回一个空列表

时间:2015-04-22 03:23:21

标签: spring annotations empty-list

我使用AnnotationConfigApplicationContext配置了spring。当我在BeanDefinition.getPropertyValues()实现中调用BeanFactoryPostProcessor时,我得到了一个空列表。但是,如果我使用ClasspathXmlApplicationContext配置spring,则返回正确的值。有谁知道原因?

这是我的代码:

@Configuration
public class AppConfig {

    @Bean
    public BeanFactoryPostProcessorTest beanFactoryPostProcessorTest(){
        return new BeanFactoryPostProcessorTest();
    }

    @Bean
    public Person person(){
        Person person = new Person();
        person.setName("name");
        person.setAge(18);
        return person;
    }
}

public class BeanFactoryPostProcessorTest implements BeanFactoryPostProcessor{
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        BeanDefinition bd = beanFactory.getBeanDefinition("person");
        MutablePropertyValues propertyValues = bd.getPropertyValues();
        if(propertyValues.contains("name")){
            propertyValues.addPropertyValue("name","zhangfei");
        }
        System.out.println("Factory modfy zhangfei");
    }
}

public class MainClass {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        /*ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("context.xml");*/
        Person person = context.getBean(Person.class);
        System.out.println(person.getName());
    }
}

非常感谢。

1 个答案:

答案 0 :(得分:0)

您只有一个空列表,因为在创建实例和分配值之前调用了BeanFactoryPostProcessor。它们将在实例创建之前调用。

我做过与使用不同界面尝试做的事情相同的事情。使用BeanPostProcessor界面。

public class BeanPostProcessorTest implements BeanPostProcessor{
    @Override
    public Object postProcessAfterInitialization(Object bean, String name)
            throws BeansException {
        if("person".equals(name)){
            Person person =((Person)bean);          
            if("name".equals(person.getName())){
                person.setName("zhangfei");
            }
            return person;
        }
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object arg0, String arg1)
            throws BeansException {
        return arg0;
    }
}