2012-04-03 44 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做到这一点更简洁时尚。

相关问题