首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据某个接口的beans通过HttpInvoker导出beans

根据某个接口的beans通过HttpInvoker导出beans
EN

Stack Overflow用户
提问于 2013-06-14 21:47:31
回答 2查看 286关注 0票数 1

我们有实现接口的bean,比如说MyServicesInterface,我们可以在java中将它自动连接为一个列表,使用

@自动连线列表{MyServicesInterface} myServices;

我想在应用程序上下文中使用sudo代码完成此操作,如下所示。

代码语言:javascript
复制
<beans>

  <util:list id="servicesList" class="ArrayList" autowire-interface="com.MyServicesInterface" />
  <for-each service:services>
      <bean id="{/remote + service.getname}" class="org....HttpInvoker">
          <property name="serviceInterface" class="{#service.getInterface()}"
      </bean>
  </for-each>

<beans>

这种{Interface}类型的动态for-each bean创建一个导出器bean将是导出bean的一个很好的模式。我知道这可以在java中完成,但是在java中为每个bean创建一个HttpInvoker会有一些困难。我怀疑这能否完全在应用程序上下文中完成,但也许有一种方法我忽略了。

任何评论或建议都是很棒的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-17 19:58:20

使用BeanDefinitionRegistryPostProcessor为您的HttpInvokerServiceExporters创建BeanDefinitions。使用注释标记服务并定义要导出的接口。

e.g

代码语言:javascript
复制
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    for (String name : registry.getBeanDefinitionNames()) {
        try {
            BeanDefinition definition = registry.getBeanDefinition(name);
            String beanClassName = defintition.getBeanClassName();

            cls = classLoader.loadClass(beanClassName);

            if(cls.isAnnotationPresent(ExportableService.class)){
                //Get annotation and pull out serviceInterface
                GenericBeanDefinition beanDef = new GenericBeanDefinition();
                beanDef.setBeanClass(HttpInvokerServiceExporter.class);

                MutablePropertyValues values = new MutablePropertyValues();
                values.addPropertyValue("service", new RuntimeBeanReference(name));
                values.addPropertyValue("serviceInterface", "service interface from annotation>);

                beanDef.setPropertyValues(values);

                // Bean name here should be e.g. /myService so its picked up by the BeanNameUrlHandlerMapping (if you so desire)
                registry.registerBeanDefinition(<beanName>, beanDef);
            }
        }
    } catch(ClassNotFoundException e){
        // Handle exception
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-06-14 22:04:09

我怀疑你是否能在xml上下文中做到这一点,但是使用java就很简单了。所以在java中我会这样做:

代码语言:javascript
复制
List<MyServicesInterface> mylist =  applicationContext.getBeansOfType(MyServicesInterface.class).values();

ServiceInterface si = applicationContext.getBean(ServiceInterface.class);
for(MyServicesInterface mi: mylist){
    si.callSomething(mi);
}

在java中我就是这么做的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17110010

复制
相关文章

相似问题

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