我们有实现接口的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}类型的动态for-each bean创建一个导出器bean将是导出bean的一个很好的模式。我知道这可以在java中完成,但是在java中为每个bean创建一个HttpInvoker会有一些困难。我怀疑这能否完全在应用程序上下文中完成,但也许有一种方法我忽略了。
任何评论或建议都是很棒的。
发布于 2013-06-17 19:58:20
使用BeanDefinitionRegistryPostProcessor为您的HttpInvokerServiceExporters创建BeanDefinitions。使用注释标记服务并定义要导出的接口。
e.g
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-14 22:04:09
我怀疑你是否能在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中我就是这么做的。
https://stackoverflow.com/questions/17110010
复制相似问题