Spring BeanFactoryPostProcessor可以找到没有名称的嵌套bean吗?

时间:2012-04-03 23:24:40

标签: spring

我正在尝试编写一个可以找到定义init方法的bean的Spring BeanFactoryPostProcessor。我很幸运能找到具有名称的bean,但不会像以下示例中的目标bean那样嵌套无名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中列出bean时,我似乎只得到名称如下面的代码:

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 个答案:

答案 0 :(得分:1)

您可以检索嵌套的BeanDefinitions,但不能通过beanFactory.getBeanDefinition检索。获取嵌套bean定义的唯一方法是通过父PropertyValues的{​​{1}} - 您需要遍历图表。

作为示例(并且缺少任何空值检查):

BeanDefinition

鉴于图遍历适用于访问者模式,您可以将BeanDefinition parentDef = beanFactory.getBeanDefinition(defName); for (PropertyValue property : parentDef.getPropertyValues().getPropertyValues()) { Object value = property.getValue(); if (value instanceof BeanDefinitionHolder) { BeanDefinition nestedDef = ((BeanDefinitionHolder)value).getBeanDefinition(); } } 子类化为更简洁的方式。