1

インターフェイスを実装する Bean があります。たとえば、MyServicesInterface を使用してリストとして Java で自動配線できます。

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

タイプ {Interface} のこの種の動的 for-each Bean がエクスポーター Bean を作成することは、Bean をエクスポートするための優れたパターンです。これはJavaで実行できることはわかっていますが、BeanごとにJavaでHttpInvokerを作成するのが難しい場合があります。これがアプリケーションのコンテキストで完全に実行できるとは思えませんが、見落としているアプローチがあるかもしれません。

コメントや提案は素晴らしいでしょう。

4

2 に答える 2

2

BeanDefinitionRegistryPostProcessor を使用して、HttpInvokerServiceExporters の BeanDefinitions を作成します。注釈を使用してサービスをマークし、エクスポートするインターフェイスを定義します。

例えば

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
    }
}
于 2013-06-17T11:58:20.080 に答える
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でどのようにするかです。

于 2013-06-14T14:04:08.640 に答える