私はあなたと同じことをしました。良い方法は、BeanPostProcessorとApplicationContextAwareを使用することです。
まず、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 { ... }
次に、BeanPostProcessorとApplicationContextAwareを実装する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;
}
}
それがお役に立てば幸いです。