2013-03-13 58 views
0

可以说我有一套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扩展机制?

感谢

回答

1

我做同样的事情,你可曾。好方法是使用BeanPostProcessorApplicationContextAware

Fristly,让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; 
    } 
} 

希望它能帮上忙。

+0

谢谢我可以实施你的建议。 – PeeWee2201 2013-04-04 13:33:16

1

您可以使用@Autowired。如果你用它来标记一个集合,它会把匹配接口的所有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 
    } 
} 

或替代,采用独创的“地图”豆和addind这个类的一个mapBuilder豆:

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 
    } 
} 
+0

谢谢。这也可能是一个有效的答案。但是,我只能接受一个。我选择了另一个,因为我们暂时不使用自动装配。 – PeeWee2201 2013-04-04 13:34:28