为什么 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;
}
}
我用 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;
}
}