假设我有一组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放入map中。当然,a,b,c不应该知道这个映射。此注册应该包含在使用导入的配置中,因为在另一个场景中,它可能是必须注册的d、e、f。我应该使用哪种Spring扩展机制?
谢谢
发布于 2013-03-13 20:03:19
我和你做过同样的事。最好的方法是使用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;
}
}希望这能有所帮助。
发布于 2013-03-13 19:15:06
您可以使用@Autowired。如果您用它标记一个集合,它将把所有匹配接口的bean都放在这个集合中。你的"map“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并添加此类的mapBuilder bean:
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
}
}https://stackoverflow.com/questions/15382384
复制相似问题