0

1つのインターフェースとマップを実装するBean(a、b、c)のセットがあるとしましょう。

M.xml

<bean name="map" class="java.util.HashMap"/>

abc.xml

<import M.xml>
<bean name="a" class="org.a"/>
<bean name="b" class="org.b"/>
<bean name="c" class="org.c"/>

def.xml

<import M.xml>
<bean name="d" class="org.d"/>
<bean name="e" class="org.e"/>
<bean name="f" class="org.f"/>

構成がインスタンス化されたら、a、b、cをマップに配置したいと思います。もちろん、a、b、cはマップについて知らないはずです。別のシナリオでは、再登録する必要があるのはd、e、fである可能性があるため、この登録はインポートを使用して構成に含める必要があります。どのSpring拡張メカニズムを使用する必要がありますか?

ありがとう

4

2 に答える 2

1

を使用できます@Autowired。コレクションにマークを付けると、一致するインターフェイスのすべてのBeanがこのコレクションに配置されます。「マップ」Beanは次のタイプである必要がありMyMapます。

public class MyMap implements Map {
  @Autowired
  private List<SharedInterface> foundBeans;

  @PostConstruct
  public void init() {
    // populate map by inserting objects from foundBeans with appropriate keys
  }
}

または、元の「マップ」Beanを使用して、このクラスのmapBuilderBeanを追加します。

public class MyMapBuilder {
  @Autowired
  private List<SharedInterface> foundBeans;

  @Resource(name="map")
  private Map map;

  @PostConstruct
  public void init() {
    // populate map by inserting objects from foundBeans with appropriate keys
  }
}
于 2013-03-13T11:15:05.963 に答える
1

私はあなたと同じことをしました。良い方法は、BeanPostProcessorApplicationContextAwareを使用することです。

まず、a、b、cに次のようなマーカーインターフェイスを実装させます。

public interface MappedValue { //leaving blank is ok because this is marker interface }

public a implements MappedValue { ... }
public b implements MappedValue { ... }
public c implements MappedValue { ... }

次に、BeanPostProcessorApplicationContextAwareを実装するBeanを定義し、アプリケーションコンテキストに追加します。

public class MapPopulator implements BeanPostProcessor, ApplicationContextAware{

    private ApplicationContext applicationContext;

    private String mapbeanName;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void setMapbeanName(String mapbeanName) {
        this.mapbeanName = mapbeanName;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

        if( bean instanceof MappedValue){
            Map map = (Map)applicationContext.getBean( mapbeanName );
            map.put( beanName, bean );
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

それがお役に立てば幸いです。

于 2013-03-13T12:03:18.687 に答える