我使用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());
}
}
非常感谢。
答案 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;
}
}