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 中完成,但是有一些困难在 java 中为每个 bean 创建一个 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

我怀疑你可以用 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 回答