首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用哪种Spring扩展机制?

我应该使用哪种Spring扩展机制?
EN

Stack Overflow用户
提问于 2013-03-13 18:14:47
回答 2查看 146关注 0票数 0

假设我有一组bean (a,b,c)实现了一个接口和一个映射。

M.xml

代码语言:javascript
复制
<bean name="map" class="java.util.HashMap"/>

abc.xml

代码语言:javascript
复制
<import M.xml>
<bean name="a" class="org.a"/>
<bean name="b" class="org.b"/>
<bean name="c" class="org.c"/>

def.xml

代码语言:javascript
复制
<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扩展机制?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-13 20:03:19

我和你做过同样的事。最好的方法是使用BeanPostProcessorApplicationContextAware

首先,让a、b、c实现一个标记接口,例如:

代码语言:javascript
复制
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,并将其添加到应用程序上下文中。

代码语言:javascript
复制
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;
    }
}

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2013-03-13 19:15:06

您可以使用@Autowired。如果您用它标记一个集合,它将把所有匹配接口的bean都放在这个集合中。你的"map“bean应该是下面的MyMap类型:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15382384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档