2013-06-14 2 views
1

У нас есть фасоль, реализующие интерфейс, позволяет сказать MyServicesInterface, который мы можем autowire в Java в виде списка с помощьюЭкспорт зерна через HttpInvoker на основе бобов определенного интерфейса

@Autowired List {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> 

Этот вид динамического для каждого бина-типа {Интерфейс} создать экспортер фасоли будет большой шаблон для экспорта зерна. Я знаю, что это можно сделать в java, но с некоторыми трудностями создать HttpInvoker в java для каждого компонента. Я сомневаюсь, что это можно сделать полностью в контексте приложения, но, возможно, есть подход, который я пропускаю.

Любые комментарии или предложения были бы замечательными.

ответ

2

Используйте BeanDefinitionRegistryPostProcessor для создания BeanDefinitions для HttpInvokerServiceExporters. Используйте аннотацию для маркировки сервисов и определения интерфейса, который вы хотите экспортировать.

например

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

Я сомневаюсь, что U может сделать это с помощью контекста 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.

+0

Проблема я бил с этим создает HttpInvoker в Java. Он полагается на жизненный цикл весенней фасоли и регистрирует другие бобы, на которые экспортируются экспортированные бин-карты. –

Смежные вопросы