2013-06-14 3 views
1

우리는 인터페이스를 구현 콩을 가지고, 우리가수출 콩

@Autowired 목록 {MyServicesInterface} myServices를 사용하여 목록으로 자바 autowire하기 수 MyServicesInterface 말할 수 있습니다;

아래와 같이 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-bean 각각은 exporter bean을 작성하는 것이 bean 내보내기에 가장 좋은 패턴이됩니다. 나는 이것이 자바에서 할 수 있지만 몇 가지 어려움을 가지고 각각의 콩에 대한 자바에서 HttpInvoker를 만드는 것을 알 수 있습니다. 나는 이것이 애플리케이션 컨텍스트에서 완전히 수행 될 수 있을지는 모르겠지만 아마 내가 바라 보는 접근법이있을 것입니다.

의견이나 제안이 우수 할 것입니다.

답변

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

저는 U가 XML 컨텍스트로 할 수 있을지 의심 스럽지만 java를 사용하면 간단합니다. 나는 그렇게 할 것입니다 자바에서 그래서 : 자바

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

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

그건 어떻게 것을.

+0

내가 그 자바에서 HttpInvoker를 만드는으로 타격 된 문제. Spring Bean 라이프 사이클에 의존하며, 내 보낸 bean이 매핑되는 URL을 다른 bean에 등록합니다. –