2015-04-22 1 views
3

Я настроил весну с AnnotationConfigApplicationContext. В то время как я вызвал BeanDefinition.getPropertyValues() в реализации BeanFactoryPostProcessor, я получил пустой список. Но если я настроил весну с ClasspathXmlApplicationContext, он вернет правильное значение. Кто-нибудь знает причину?почему BeanDefinition.getPropertyValues ​​возвращает пустой список

Вот мои коды:

@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

Из Java ЕГО BeanFactoryPostProcessor, ** На BeanFactoryPostProcessor может взаимодействовать и изменять определения боба, но никогда экземпляров боба. **. Вы пытаетесь изменить экземпляр, а не определение. Удовлетворение, если это правильный интерфейс, который вам нужно использовать. – ArunM

+0

благодарит за вашу помощь. в то время как я читал документ, у меня была такая же мысль, как и вы. поэтому я пытаюсь найти разницу между BeanFactoryPostProcessor и BeanPostProcessor, все они дали тот же код expample, что и выше. поэтому я попробовал сам и нашел проблему. У меня есть два вопроса. 1. Как использовать BeanFactoryPostProcessor? как я могу изменить beandefinition? 2. как я описал above.why я получил пустой список после BeanDefinition.getPropertyValues ​​()? спасибо. –

+0

ОК .. так надеюсь, что мое решение решит вашу проблему. – ArunM

ответ

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; 
    } 
} 
+0

Я могу сделать это с помощью отражения. но я хочу знать, почему я получил пустой список после вызова BeanDefinition.getPropertyValues ​​()? но спасибо все равно. –

+1

Изменен ответ. Можете ли вы принять ответ, если это решит вашу проблему? – ArunM

Смежные вопросы