diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java index 06deb57fdd9..c3e3dca907e 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java @@ -16,9 +16,12 @@ */ package org.apache.dubbo.config.spring.beans.factory.annotation; +import java.util.Collections; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.ArrayUtils; +import org.apache.dubbo.config.MethodConfig; +import org.apache.dubbo.config.annotation.Method; import org.apache.dubbo.config.annotation.Service; import org.apache.dubbo.config.spring.ServiceBean; import org.apache.dubbo.config.spring.context.annotation.DubboClassPathBeanDefinitionScanner; @@ -387,6 +390,11 @@ private AbstractBeanDefinition buildServiceBeanDefinition(Annotation serviceAnno builder.addPropertyValue("interface", interfaceClass.getName()); // Convert parameters into map builder.addPropertyValue("parameters", convertParameters(serviceAnnotationAttributes.getStringArray("parameters"))); + // Add methods parameters + List methodConfigs = convertMethodConfigs(serviceAnnotationAttributes.get("methods")); + if (!methodConfigs.isEmpty()) { + builder.addPropertyValue("methods", methodConfigs); + } /** * Add {@link org.apache.dubbo.config.ProviderConfig} Bean reference @@ -447,6 +455,12 @@ private AbstractBeanDefinition buildServiceBeanDefinition(Annotation serviceAnno } + private List convertMethodConfigs(Object methodsAnnotation) { + if (methodsAnnotation == null){ + return Collections.EMPTY_LIST; + } + return MethodConfig.constructMethodConfig((Method[])methodsAnnotation); + } private ManagedList toRuntimeBeanReferences(String... beanNames) { diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java index 19ced2b3065..ea13daf10e8 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/AnnotationUtils.java @@ -343,21 +343,9 @@ public static Map getAttributes(Annotation annotation, PropertyR if (ignoreDefaultValue && nullSafeEquals(attributeValue, getDefaultValue(annotation, attributeName))) { continue; } - - /** - * @since 2.7.1 - * ignore annotation member - */ - if (attributeValue.getClass().isAnnotation()) { - continue; - } - if (attributeValue.getClass().isArray() && attributeValue.getClass().getComponentType().isAnnotation()) { - continue; - } actualAttributes.put(attributeName, attributeValue); } - return resolvePlaceholders(actualAttributes, propertyResolver, ignoreAttributeNames); } diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java index 56fd2970b29..d1a695f8d3c 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java @@ -16,6 +16,7 @@ */ package org.apache.dubbo.config.spring.beans.factory.annotation; +import org.apache.dubbo.config.annotation.Method; import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.spring.ReferenceBean; import org.apache.dubbo.config.spring.api.DemoService; @@ -47,14 +48,14 @@ */ @RunWith(SpringRunner.class) @ContextConfiguration( - classes = { - ServiceAnnotationTestConfiguration.class, - ReferenceAnnotationBeanPostProcessorTest.class - }) + classes = { + ServiceAnnotationTestConfiguration.class, + ReferenceAnnotationBeanPostProcessorTest.class + }) @TestPropertySource(properties = { - "packagesToScan = org.apache.dubbo.config.spring.context.annotation.provider", - "consumer.version = ${demo.service.version}", - "consumer.url = dubbo://127.0.0.1:12345?version=2.5.7", + "packagesToScan = org.apache.dubbo.config.spring.context.annotation.provider", + "consumer.version = ${demo.service.version}", + "consumer.url = dubbo://127.0.0.1:12345?version=2.5.7", }) public class ReferenceAnnotationBeanPostProcessorTest { @@ -79,7 +80,7 @@ public ReferenceAnnotationBeanPostProcessor referenceAnnotationBeanPostProcessor @Qualifier("helloServiceImpl") private HelloService helloServiceImpl; - @Reference(id = "helloService") + @Reference(id = "helloService", methods = @Method(name = "sayName", timeout = 100)) private HelloService helloService; @Test @@ -131,7 +132,7 @@ public void test() throws Exception { public void testGetReferenceBeans() { ReferenceAnnotationBeanPostProcessor beanPostProcessor = context.getBean(BEAN_NAME, - ReferenceAnnotationBeanPostProcessor.class); + ReferenceAnnotationBeanPostProcessor.class); Collection> referenceBeans = beanPostProcessor.getReferenceBeans(); @@ -139,8 +140,6 @@ public void testGetReferenceBeans() { ReferenceBean referenceBean = referenceBeans.iterator().next(); - TestBean testBean = context.getBean(TestBean.class); - Assert.assertNotNull(referenceBean.get()); } @@ -149,11 +148,10 @@ public void testGetReferenceBeans() { public void testGetInjectedFieldReferenceBeanMap() { ReferenceAnnotationBeanPostProcessor beanPostProcessor = context.getBean(BEAN_NAME, - ReferenceAnnotationBeanPostProcessor.class); - + ReferenceAnnotationBeanPostProcessor.class); Map> referenceBeanMap = - beanPostProcessor.getInjectedFieldReferenceBeanMap(); + beanPostProcessor.getInjectedFieldReferenceBeanMap(); Assert.assertEquals(2, referenceBeanMap.size()); @@ -162,7 +160,7 @@ public void testGetInjectedFieldReferenceBeanMap() { InjectionMetadata.InjectedElement injectedElement = entry.getKey(); Assert.assertEquals("org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor$AnnotatedFieldElement", - injectedElement.getClass().getName()); + injectedElement.getClass().getName()); } @@ -172,11 +170,10 @@ public void testGetInjectedFieldReferenceBeanMap() { public void testGetInjectedMethodReferenceBeanMap() { ReferenceAnnotationBeanPostProcessor beanPostProcessor = context.getBean(BEAN_NAME, - ReferenceAnnotationBeanPostProcessor.class); - + ReferenceAnnotationBeanPostProcessor.class); Map> referenceBeanMap = - beanPostProcessor.getInjectedMethodReferenceBeanMap(); + beanPostProcessor.getInjectedMethodReferenceBeanMap(); Assert.assertEquals(2, referenceBeanMap.size()); @@ -185,33 +182,32 @@ public void testGetInjectedMethodReferenceBeanMap() { InjectionMetadata.InjectedElement injectedElement = entry.getKey(); Assert.assertEquals("org.apache.dubbo.config.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor$AnnotatedMethodElement", - injectedElement.getClass().getName()); + injectedElement.getClass().getName()); } } -// @Test -// public void testModuleInfo() { -// -// ReferenceAnnotationBeanPostProcessor beanPostProcessor = context.getBean(BEAN_NAME, -// ReferenceAnnotationBeanPostProcessor.class); -// -// -// Map> referenceBeanMap = -// beanPostProcessor.getInjectedMethodReferenceBeanMap(); -// -// for (Map.Entry> entry : referenceBeanMap.entrySet()) { -// ReferenceBean referenceBean = entry.getValue(); -// -// assertThat(referenceBean.getModule().getName(), is("defaultModule")); -// assertThat(referenceBean.getMonitor(), not(nullValue())); -// } -// } + // @Test + // public void testModuleInfo() { + // + // ReferenceAnnotationBeanPostProcessor beanPostProcessor = context.getBean(BEAN_NAME, + // ReferenceAnnotationBeanPostProcessor.class); + // + // + // Map> referenceBeanMap = + // beanPostProcessor.getInjectedMethodReferenceBeanMap(); + // + // for (Map.Entry> entry : referenceBeanMap.entrySet()) { + // ReferenceBean referenceBean = entry.getValue(); + // + // assertThat(referenceBean.getModule().getName(), is("defaultModule")); + // assertThat(referenceBean.getMonitor(), not(nullValue())); + // } + // } private static class AncestorBean { - private DemoService demoServiceFromAncestor; @Autowired @@ -232,7 +228,6 @@ public ApplicationContext getApplicationContext() { } - private static class ParentBean extends AncestorBean { @Reference(version = "${consumer.version}", url = "${consumer.url}") @@ -242,7 +237,6 @@ public DemoService getDemoServiceFromParent() { return demoServiceFromParent; } - } static class TestBean extends ParentBean { @@ -265,4 +259,21 @@ public void setDemoService(DemoService demoService) { } } + @Test + public void testReferenceBeansMethodAnnotation() { + + ReferenceAnnotationBeanPostProcessor beanPostProcessor = context.getBean(BEAN_NAME, + ReferenceAnnotationBeanPostProcessor.class); + + Collection> referenceBeans = beanPostProcessor.getReferenceBeans(); + + Assert.assertEquals(2, referenceBeans.size()); + + ReferenceBean referenceBean = referenceBeans.iterator().next(); + + if ("helloService".equals(referenceBean.getId())) { + Assert.assertNotNull(referenceBean.getMethods()); + } + } + } \ No newline at end of file diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessorTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessorTest.java index 22325d96ebf..17d3023dc61 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessorTest.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessorTest.java @@ -17,6 +17,7 @@ package org.apache.dubbo.config.spring.beans.factory.annotation; import org.apache.dubbo.config.spring.ServiceBean; +import org.apache.dubbo.config.spring.api.DemoService; import org.apache.dubbo.config.spring.api.HelloService; import org.junit.Assert; @@ -79,4 +80,17 @@ public void test() { } + @Test + public void testMethodAnnotation() { + + Map serviceBeansMap = beanFactory.getBeansOfType(ServiceBean.class); + + Assert.assertEquals(2, serviceBeansMap.size()); + + ServiceBean demoServiceBean = serviceBeansMap.get("ServiceBean:org.apache.dubbo.config.spring.api.DemoService:2.5.7"); + + Assert.assertNotNull(demoServiceBean.getMethods()); + + } + } diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/DemoServiceImpl.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/DemoServiceImpl.java index 3aa1e86f4e6..8ee2a8a09f6 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/DemoServiceImpl.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/DemoServiceImpl.java @@ -16,6 +16,7 @@ */ package org.apache.dubbo.config.spring.context.annotation.provider; +import org.apache.dubbo.config.annotation.Method; import org.apache.dubbo.config.spring.api.Box; import org.apache.dubbo.config.spring.api.DemoService; @@ -32,7 +33,8 @@ version = "2.5.7", application = "${demo.service.application}", protocol = "${demo.service.protocol}", - registry = "${demo.service.registry}" + registry = "${demo.service.registry}", + methods = @Method(timeout = 100,name = "sayName") ) @Service @Transactional diff --git a/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-consumer/src/main/java/org/apache/dubbo/demo/consumer/comp/DemoServiceComponent.java b/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-consumer/src/main/java/org/apache/dubbo/demo/consumer/comp/DemoServiceComponent.java index 4305ed6c05f..757994db0da 100644 --- a/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-consumer/src/main/java/org/apache/dubbo/demo/consumer/comp/DemoServiceComponent.java +++ b/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-consumer/src/main/java/org/apache/dubbo/demo/consumer/comp/DemoServiceComponent.java @@ -19,6 +19,7 @@ package org.apache.dubbo.demo.consumer.comp; +import org.apache.dubbo.config.annotation.Method; import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.demo.DemoService; @@ -26,7 +27,7 @@ @Component("demoServiceComponent") public class DemoServiceComponent implements DemoService { - @Reference + @Reference(timeout = 100,methods = @Method(timeout = 500,name = "sayHello")) private DemoService demoService; @Override diff --git a/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-consumer/src/main/resources/spring/dubbo-consumer.properties b/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-consumer/src/main/resources/spring/dubbo-consumer.properties index 5ec658ba925..bda13add464 100644 --- a/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-consumer/src/main/resources/spring/dubbo-consumer.properties +++ b/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-consumer/src/main/resources/spring/dubbo-consumer.properties @@ -18,4 +18,4 @@ # dubbo.application.name=dubbo-demo-annotation-consumer -dubbo.registry.address=multicast://224.5.6.7:1234 +dubbo.registry.address=zookeeper://127.0.0.1:2181 diff --git a/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-provider/src/main/java/org/apache/dubbo/demo/provider/Application.java b/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-provider/src/main/java/org/apache/dubbo/demo/provider/Application.java index b848865dee3..9190d08c668 100644 --- a/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-provider/src/main/java/org/apache/dubbo/demo/provider/Application.java +++ b/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-provider/src/main/java/org/apache/dubbo/demo/provider/Application.java @@ -44,7 +44,7 @@ static class ProviderConfiguration { @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); - registryConfig.setAddress("multicast://224.5.6.7:1234"); + registryConfig.setAddress("zookeeper://127.0.0.1:2181"); return registryConfig; } } diff --git a/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-provider/src/main/java/org/apache/dubbo/demo/provider/DemoServiceImpl.java b/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-provider/src/main/java/org/apache/dubbo/demo/provider/DemoServiceImpl.java index cb06537ae01..96971db10b5 100644 --- a/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-provider/src/main/java/org/apache/dubbo/demo/provider/DemoServiceImpl.java +++ b/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-provider/src/main/java/org/apache/dubbo/demo/provider/DemoServiceImpl.java @@ -18,6 +18,7 @@ */ package org.apache.dubbo.demo.provider; +import org.apache.dubbo.config.annotation.Method; import org.apache.dubbo.config.annotation.Service; import org.apache.dubbo.demo.DemoService; import org.apache.dubbo.rpc.RpcContext; @@ -25,12 +26,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Service +@Service(timeout = 100,methods = @Method(timeout = 1000,name = "sayHello")) public class DemoServiceImpl implements DemoService { private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class); @Override public String sayHello(String name) { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress(); }