有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java基于特定接口的bean通过HttpInvoker导出bean

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

@自动连线 列出{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中完成,但是在为每个bean创建一个java HttpInvoker时有一些困难。我怀疑这完全可以在应用程序上下文中完成,但也许有一种方法我忽略了

任何评论或建议都会很好


共 (2) 个答案

  1. # 1 楼答案

    我怀疑你能在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中使用它的方式

  2. # 2 楼答案

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

    例如

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