2013-11-28 2 views
0

Для целей отладки, я хотел бы сделать это:Можно ли «автоувеличивать» определение bean-компонента в bean-компоненте?

@Autowired 
private BeanDefinition myBeanDefinition; 

т.е. после того, как завод создал боб, он должен телеграфировать определение бина в него, так что я могу легко увидеть, откуда она во время отладки.

Или, может быть, есть другой способ увидеть во время выполнения, где был определен компонент?

ответ

2

Вы можете использовать BeanPostProcessor:

import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.config.BeanDefinition; 
import org.springframework.beans.factory.config.BeanPostProcessor; 
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ConfigurableApplicationContext; 

public class AutowireBeanDefinitionPostProcessor implements BeanPostProcessor { 

    @Autowired 
    private ApplicationContext applicationContext; 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 

     if(bean instanceof BeanDefinitionAware) { 
      ConfigurableListableBeanFactory factory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); 
      BeanDefinition bd = factory.getBeanDefinition(beanName); 

      ((BeanDefinitionAware) bean).setBeanDefinition(bd); 
     } 

     return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
     return bean; 
    } 
} 

Сделайте бобы реализации BeanDefinitionAware:

import org.springframework.beans.factory.config.BeanDefinition; 

public interface BeanDefinitionAware { 
    void setBeanDefinition(BeanDefinition beanDefinition); 
} 

и вы можете сохранить определение в поле.

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