通过HttpInvoker基于某些接口的bean导出bean

时间:2013-06-14 13:47:31

标签: java spring spring-mvc applicationcontext

我们有bean实现一个接口,让我们说MyServicesInterface我们可以使用

在java中作为列表自动装配

@Autowired 列出{MyServicesInterface} myServices;

我想在使用sudo代码的应用程序上下文中执行此操作。

<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}的每个bean的动态创建导出器bean对于导出bean来说是一个很好的模式。我知道这可以在java中完成但是有一些困难在java中为每个bean创建一个HttpInvoker。我怀疑这可以在应用程序环境中完全完成,但也许我忽略了一种方法。

任何评论或建议都会很棒。

2 个答案:

答案 0 :(得分:2)

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

e.g

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

答案 1 :(得分:0)

我怀疑你可以用xml上下文来做,但是使用java它很简单。 所以在java中我会这样做:

List<MyServicesInterface> mylist =  applicationContext.getBeansOfType(MyServicesInterface.class).values();

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

我在Java中的表现如何。