2012-04-03 6 views
0

私は、initメソッドを定義するBeanを見つけることができるSpring BeanFactoryPostProcessorを作成しようとしています。私は名前を持っている運見つけ豆を持つが、次の例では、ターゲットBeanのように無名の豆を入れ子になっていない午前:Spring BeanFactoryPostProcessorはネストされたBeanを名前なしで見つけることができますか?

<bean id="aclDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <property name="transactionManager"><ref bean="transactionManager"/></property> 
    <property name="target"> 
     <bean class="com.vidsys.dao.impl.acl.ACLDaoImpl" init-method="init"> 
      <property name="sessionFactory"><ref local="sessionFactory"/></property> 
     </bean> 
    </property> 
    <property name="transactionAttributes"> 
    <props> 
    <prop key="*">PROPAGATION_REQUIRED</prop> 
    </props> 
    </property> 
</bean> 

私は私のBeanFactoryPostProcessorで豆をリスト私は名前だけを持つものを得るように見えるのように次のコード:

public class BeanInitializationFinder implements BeanFactoryPostProcessor, Ordered { 
    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 
    throws BeansException { 

     //String[] beanDefs = BeanFactoryUtils.beanNamesIncludingAncestors(beanFactory); 
     String[] beanDefs = beanFactory.getBeanDefinitionNames(); 
     for(String defName : beanDefs) { 
      BeanDefinition def = beanFactory.getBeanDefinition(defName); 
      if(null == def.getBeanClassName() || !(def instanceof AbstractBeanDefinition)) 
       return; 
      } 
      AbstractBeanDefinition abd = (AbstractBeanDefinition) def; 
      try { 
       if(abd.getFactoryMethodName() == null && abd.getFactoryBeanName() == null) 
        Class<?> beanClass = Class.forName(abd.getBeanClassName()); 
        if(InitializingBean.class.isAssignableFrom(beanClass) || null != abd.getInitMethodName()) { 
         beansWithInits.add(defName); 
        } 
       } 
      } 
      catch(Exception e) { 
       throw new BeanIntrospectionException("Failed to instrospect bean defs", e); 
      } 
     } 
    } 

} 

私は無名のあるネストされた豆を含むのinitメソッドを、持っているすべてのBeanを取得したいと思います。それをしてもいいですか?

答えて

1

ネストされたBeanDefinitionsは取得できますが、beanFactory.getBeanDefinitionでは取得できません。ネストされたBean定義に到達する唯一の方法は、BeanDefinitionPropertyValuesを経由することです。グラフを移動する必要があります。グラフトラバーサルは、Visitorパターンでうまく動作することを考えると、あなたはより簡潔な方法でこれを行うにはorg.springframework.beans.factory.config.BeanDefinitionVisitorをサブクラス化することができます

BeanDefinition parentDef = beanFactory.getBeanDefinition(defName); 
for (PropertyValue property : parentDef.getPropertyValues().getPropertyValues()) { 
    Object value = property.getValue(); 
    if (value instanceof BeanDefinitionHolder) { 
     BeanDefinition nestedDef = ((BeanDefinitionHolder)value).getBeanDefinition(); 
    } 
} 

:一例として(および任意のヌルチェックを逃す)することにより

関連する問題