2012-04-03 43 views
0

我想寫一個Spring BeanFactoryPostProcessor,它可以找到任何定義了init方法的bean。我有運氣找到豆有名字,但在下面的例子中沒有嵌套無名豆作爲目標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,包括無名的嵌套bean。我可以這樣做嗎?

回答

1

您可以檢索嵌套BeanDefinitions,但不能通過beanFactory.getBeanDefinition。獲取嵌套bean定義的唯一方法是通過父代BeanDefinitionPropertyValues - 您需要走圖。

通過舉例的方式(和失蹤任何null檢查):

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

鑑於圖的遍歷與訪問者模式效果很好,你也可以繼承org.springframework.beans.factory.config.BeanDefinitionVisitor做到這一點更簡潔時尚。

相關問題