0

init-method を定義する任意の 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 をリストすると、次のコードのような名前の 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);
          }
      }
  }

}

名前のないネストされた Bean を含む、init-method を持つすべての Bean を取得したいと思います。それをしてもいいですか?

4

1 に答える 1

1

ネストされたBeanDefinitionsを取得できますが、を介して取得することはできませんbeanFactory.getBeanDefinition。ネストされたBean定義に到達する唯一の方法PropertyValuesは、親BeanDefinitionを使用することです。グラフをたどる必要があります。

例として(そして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();
    }
}

グラフトラバーサルがVisitorパターンでうまく機能することを考えると、サブクラス化org.springframework.beans.factory.config.BeanDefinitionVisitorしてこれをより簡潔に行うことができます。

于 2012-07-04T10:00:22.640 に答える