为什么 BeanDefinition.getPropertyValues return 一个空列表

why BeanDefinition.getPropertyValues return an empty list

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

这是我的代码:

@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());
    }
}

非常感谢。

您得到一个空列表只是因为 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;
    }
}