Skip to content

Commit

Permalink
@service and @reference issues on <dubbo:annotation>
Browse files Browse the repository at this point in the history
To resolve alibaba/dubbo apache#1125
  • Loading branch information
mercyblitz committed Dec 26, 2017
1 parent adfbff3 commit 3e19343
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,13 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) t

Set<String> resolvedPackagesToScan = resolvePackagesToScan(packagesToScan);

registerServiceBeans(resolvedPackagesToScan, registry);
if (!CollectionUtils.isEmpty(resolvedPackagesToScan)) {
registerServiceBeans(resolvedPackagesToScan, registry);
} else {
if (logger.isWarnEnabled()) {
logger.warn("packagesToScan is empty , ServiceBean registry will be ignored!");
}
}

}

Expand Down Expand Up @@ -321,8 +327,10 @@ private Class<?> resolveClass(BeanDefinition beanDefinition) {
private Set<String> resolvePackagesToScan(Set<String> packagesToScan) {
Set<String> resolvedPackagesToScan = new LinkedHashSet<String>(packagesToScan.size());
for (String packageToScan : packagesToScan) {
String resolvedPackageToScan = environment.resolvePlaceholders(packageToScan);
resolvedPackagesToScan.add(resolvedPackageToScan);
if (StringUtils.hasText(packageToScan)) {
String resolvedPackageToScan = environment.resolvePlaceholders(packageToScan.trim());
resolvedPackagesToScan.add(resolvedPackageToScan);
}
}
return resolvedPackagesToScan;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.alibaba.dubbo.config.spring.schema;

import com.alibaba.dubbo.config.spring.AnnotationBean;
import com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor;
import com.alibaba.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationBeanPostProcessor;
import com.alibaba.dubbo.config.spring.util.BeanRegistrar;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;

import static org.springframework.util.StringUtils.commaDelimitedListToStringArray;
import static org.springframework.util.StringUtils.trimArrayElements;

/**
* {@link AnnotationBean} {@link BeanDefinitionParser}
*
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
* @see ServiceAnnotationBeanPostProcessor
* @see ReferenceAnnotationBeanPostProcessor
* @since 2.5.9
*/
public class AnnotationBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

/**
* parse
* <prev>
* &lt;dubbo:annotation package="" /&gt;
* </prev>
*
* @param element
* @param parserContext
* @param builder
*/
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {

String packageToScan = element.getAttribute("package");

String[] packagesToScan = trimArrayElements(commaDelimitedListToStringArray(packageToScan));

builder.addConstructorArgValue(packagesToScan);

builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);

// Registers ReferenceAnnotationBeanPostProcessor
registerReferenceAnnotationBeanPostProcessor(parserContext.getRegistry());

}

/**
* Registers {@link ReferenceAnnotationBeanPostProcessor} into {@link BeanFactory}
*
* @param registry {@link BeanDefinitionRegistry}
*/
private void registerReferenceAnnotationBeanPostProcessor(BeanDefinitionRegistry registry) {

// Register @Reference Annotation Bean Processor
BeanRegistrar.registerInfrastructureBean(registry,
ReferenceAnnotationBeanPostProcessor.BEAN_NAME, ReferenceAnnotationBeanPostProcessor.class);

}

protected Class<?> getBeanClass(Element element) {
return ServiceAnnotationBeanPostProcessor.class;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import com.alibaba.dubbo.common.Version;
import com.alibaba.dubbo.config.*;
import com.alibaba.dubbo.config.spring.AnnotationBean;
import com.alibaba.dubbo.config.spring.ReferenceBean;
import com.alibaba.dubbo.config.spring.ServiceBean;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
Expand All @@ -44,7 +43,7 @@ public void init() {
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,16 @@ public void test() {

Assert.assertEquals(3, serviceBeansMap.size());

Map<String, ServiceAnnotationBeanPostProcessor> beanPostProcessorsMap =
beanFactory.getBeansOfType(ServiceAnnotationBeanPostProcessor.class);

Assert.assertEquals(4, beanPostProcessorsMap.size());

Assert.assertTrue(beanPostProcessorsMap.containsKey("doubleServiceAnnotationBeanPostProcessor"));
Assert.assertTrue(beanPostProcessorsMap.containsKey("emptyServiceAnnotationBeanPostProcessor"));
Assert.assertTrue(beanPostProcessorsMap.containsKey("serviceAnnotationBeanPostProcessor"));
Assert.assertTrue(beanPostProcessorsMap.containsKey("serviceAnnotationBeanPostProcessor2"));

}

@ImportResource("META-INF/spring/dubbo-annotation-provider.xml")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,12 @@

<dubbo:protocol name="dubbo" port="12345"/>

<!-- Annotation 注册 -->
<dubbo:annotation id="doubleServiceAnnotationBeanPostProcessor"
package="com.alibaba.dubbo.config.spring.context.annotation.provider ,
com.alibaba.dubbo.config.spring.context.annotation.provider"/>

<dubbo:annotation id="emptyServiceAnnotationBeanPostProcessor"
package=" "/>

</beans>

0 comments on commit 3e19343

Please sign in to comment.