This is an automated email from the ASF dual-hosted git repository. mercyblitz pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/master by this push: new 434f9dd Polish apache/dubbo#6078 : [Enhancement] Resolving the placeholders of XML BeanDefinition in the Configuration Class (#6079) 434f9dd is described below commit 434f9dd393286247d921be7a14b3873518e38622 Author: Mercy Ma <mercybl...@gmail.com> AuthorDate: Tue Apr 28 17:29:03 2020 +0800 Polish apache/dubbo#6078 : [Enhancement] Resolving the placeholders of XML BeanDefinition in the Configuration Class (#6079) --- .../spring/schema/DubboBeanDefinitionParser.java | 51 ++++++++++++---------- .../spring/schema/DubboNamespaceHandlerTest.java | 35 +++++++++++++-- .../resources/META-INF/demo-provider.properties | 12 +++++ ...o-provider.xml => demo-provider-properties.xml} | 20 ++------- .../apache/dubbo/config/spring/demo-provider.xml | 6 +-- 5 files changed, 79 insertions(+), 45 deletions(-) diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java index 1cf027a..5a849ff 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.core.env.Environment; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; @@ -83,14 +84,14 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { RootBeanDefinition beanDefinition = new RootBeanDefinition(); beanDefinition.setBeanClass(beanClass); beanDefinition.setLazyInit(false); - String id = element.getAttribute("id"); + String id = resolveAttribute(element, "id", parserContext); if (StringUtils.isEmpty(id) && required) { - String generatedBeanName = element.getAttribute("name"); + String generatedBeanName = resolveAttribute(element, "name", parserContext); if (StringUtils.isEmpty(generatedBeanName)) { if (ProtocolConfig.class.equals(beanClass)) { generatedBeanName = "dubbo"; } else { - generatedBeanName = element.getAttribute("interface"); + generatedBeanName = resolveAttribute(element, "interface", parserContext); } } if (StringUtils.isEmpty(generatedBeanName)) { @@ -121,21 +122,21 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { } } } else if (ServiceBean.class.equals(beanClass)) { - String className = element.getAttribute("class"); + String className = resolveAttribute(element, "class", parserContext); if (StringUtils.isNotEmpty(className)) { RootBeanDefinition classDefinition = new RootBeanDefinition(); classDefinition.setBeanClass(ReflectUtils.forName(className)); classDefinition.setLazyInit(false); - parseProperties(element.getChildNodes(), classDefinition); + parseProperties(element.getChildNodes(), classDefinition, parserContext); beanDefinition.getPropertyValues().addPropertyValue("ref", new BeanDefinitionHolder(classDefinition, id + "Impl")); } - } else if(ReferenceBean.class.equals(beanClass)){ - String interfaceClassName = element.getAttribute("interface"); - if(StringUtils.isNotEmpty(interfaceClassName)){ + } else if (ReferenceBean.class.equals(beanClass)) { + String interfaceClassName = resolveAttribute(element, "interface", parserContext); + if (StringUtils.isNotEmpty(interfaceClassName)) { Class<?> interfaceClass = ReflectUtils.forName(interfaceClassName); beanDefinition.setTargetType(interfaceClass); } - }else if (ProviderConfig.class.equals(beanClass)) { + } else if (ProviderConfig.class.equals(beanClass)) { parseNested(element, parserContext, ServiceBean.class, true, "service", "provider", id, beanDefinition); } else if (ConsumerConfig.class.equals(beanClass)) { parseNested(element, parserContext, ReferenceBean.class, false, "reference", "consumer", id, beanDefinition); @@ -169,13 +170,13 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { continue; } if ("parameters".equals(property)) { - parameters = parseParameters(element.getChildNodes(), beanDefinition); + parameters = parseParameters(element.getChildNodes(), beanDefinition, parserContext); } else if ("methods".equals(property)) { parseMethods(id, element.getChildNodes(), beanDefinition, parserContext); } else if ("arguments".equals(property)) { parseArguments(id, element.getChildNodes(), beanDefinition, parserContext); } else { - String value = element.getAttribute(property); + String value = resolveAttribute(element, property, parserContext); if (value != null) { value = value.trim(); if (value.length() > 0) { @@ -267,7 +268,7 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { || tag.equals(node.getLocalName())) { if (first) { first = false; - String isDefault = element.getAttribute("default"); + String isDefault = resolveAttribute(element, "default", parserContext); if (StringUtils.isEmpty(isDefault)) { beanDefinition.getPropertyValues().addPropertyValue("default", "false"); } @@ -280,7 +281,7 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { } } - private static void parseProperties(NodeList nodeList, RootBeanDefinition beanDefinition) { + private static void parseProperties(NodeList nodeList, RootBeanDefinition beanDefinition, ParserContext parserContext) { if (nodeList == null) { return; } @@ -291,10 +292,10 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { Element element = (Element) nodeList.item(i); if ("property".equals(element.getNodeName()) || "property".equals(element.getLocalName())) { - String name = element.getAttribute("name"); + String name = resolveAttribute(element, "name", parserContext); if (StringUtils.isNotEmpty(name)) { - String value = element.getAttribute("value"); - String ref = element.getAttribute("ref"); + String value = resolveAttribute(element, "value", parserContext); + String ref = resolveAttribute(element, "ref", parserContext); if (StringUtils.isNotEmpty(value)) { beanDefinition.getPropertyValues().addPropertyValue(name, value); } else if (StringUtils.isNotEmpty(ref)) { @@ -308,7 +309,7 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { } @SuppressWarnings("unchecked") - private static ManagedMap parseParameters(NodeList nodeList, RootBeanDefinition beanDefinition) { + private static ManagedMap parseParameters(NodeList nodeList, RootBeanDefinition beanDefinition, ParserContext parserContext) { if (nodeList == null) { return null; } @@ -323,9 +324,9 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { if (parameters == null) { parameters = new ManagedMap(); } - String key = element.getAttribute("key"); - String value = element.getAttribute("value"); - boolean hide = "true".equals(element.getAttribute("hide")); + String key = resolveAttribute(element, "key", parserContext); + String value = resolveAttribute(element, "value", parserContext); + boolean hide = "true".equals(resolveAttribute(element, "hide", parserContext)); if (hide) { key = HIDE_KEY_PREFIX + key; } @@ -348,7 +349,7 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { } Element element = (Element) nodeList.item(i); if ("method".equals(element.getNodeName()) || "method".equals(element.getLocalName())) { - String methodName = element.getAttribute("name"); + String methodName = resolveAttribute(element, "name", parserContext); if (StringUtils.isEmpty(methodName)) { throw new IllegalStateException("<dubbo:method> name attribute == null"); } @@ -381,7 +382,7 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { } Element element = (Element) nodeList.item(i); if ("argument".equals(element.getNodeName()) || "argument".equals(element.getLocalName())) { - String argumentIndex = element.getAttribute("index"); + String argumentIndex = resolveAttribute(element, "index", parserContext); if (arguments == null) { arguments = new ManagedList(); } @@ -415,4 +416,10 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser { private void registerDubboConfigAliasPostProcessor(BeanDefinitionRegistry registry) { registerInfrastructureBean(registry, DubboConfigAliasPostProcessor.BEAN_NAME, DubboConfigAliasPostProcessor.class); } + + private static String resolveAttribute(Element element, String attributeName, ParserContext parserContext) { + String attributeValue = element.getAttribute(attributeName); + Environment environment = parserContext.getReaderContext().getEnvironment(); + return environment.resolvePlaceholders(attributeValue); + } } diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandlerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandlerTest.java index 43c67df..a7c733c 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandlerTest.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandlerTest.java @@ -32,6 +32,11 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanCreationException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; +import org.springframework.context.annotation.PropertySource; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.Map; @@ -52,21 +57,43 @@ public class DubboNamespaceHandlerTest { ApplicationModel.getConfigManager().clear(); } + @Configuration + @PropertySource("classpath:/META-INF/demo-provider.properties") + @ImportResource(locations = "classpath:/org/apache/dubbo/config/spring/demo-provider.xml") + static class XmlConfiguration { + + } + + @Test + public void testProviderXmlOnConfigurationClass() { + AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); + applicationContext.register(XmlConfiguration.class); + applicationContext.refresh(); + testProviderXml(applicationContext); + } + @Test public void testProviderXml() { - ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(ConfigTest.class.getPackage().getName().replace('.', '/') + "/demo-provider.xml"); + ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext( + ConfigTest.class.getPackage().getName().replace('.', '/') + "/demo-provider.xml", + ConfigTest.class.getPackage().getName().replace('.', '/') + "/demo-provider-properties.xml" + ); ctx.start(); - ProtocolConfig protocolConfig = ctx.getBean(ProtocolConfig.class); + testProviderXml(ctx); + } + + private void testProviderXml(ApplicationContext context) { + ProtocolConfig protocolConfig = context.getBean(ProtocolConfig.class); assertThat(protocolConfig, not(nullValue())); assertThat(protocolConfig.getName(), is("dubbo")); assertThat(protocolConfig.getPort(), is(20813)); - ApplicationConfig applicationConfig = ctx.getBean(ApplicationConfig.class); + ApplicationConfig applicationConfig = context.getBean(ApplicationConfig.class); assertThat(applicationConfig, not(nullValue())); assertThat(applicationConfig.getName(), is("demo-provider")); - DemoService service = ctx.getBean(DemoService.class); + DemoService service = context.getBean(DemoService.class); assertThat(service, not(nullValue())); } diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/demo-provider.properties b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/demo-provider.properties new file mode 100644 index 0000000..62c3412 --- /dev/null +++ b/dubbo-config/dubbo-config-spring/src/test/resources/META-INF/demo-provider.properties @@ -0,0 +1,12 @@ +# The properties for org/apache/dubbo/config/spring/demo-provider.xml + +# <dubbo:application name="${dubbo.application.name}"/> +dubbo.application.name = demo-provider + +# <dubbo:registry address="${dubbo.registry.address}"/> +dubbo.registry.address = N/A + +# <dubbo:protocol name="${dubbo.protocol.name}" port="${dubbo.protocol.port}"/> +dubbo.protocol.name = dubbo +dubbo.protocol.port = 20813 + diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/org/apache/dubbo/config/spring/demo-provider.xml b/dubbo-config/dubbo-config-spring/src/test/resources/org/apache/dubbo/config/spring/demo-provider-properties.xml similarity index 61% copy from dubbo-config/dubbo-config-spring/src/test/resources/org/apache/dubbo/config/spring/demo-provider.xml copy to dubbo-config/dubbo-config-spring/src/test/resources/org/apache/dubbo/config/spring/demo-provider-properties.xml index 0105571..e0963d2 100644 --- a/dubbo-config/dubbo-config-spring/src/test/resources/org/apache/dubbo/config/spring/demo-provider.xml +++ b/dubbo-config/dubbo-config-spring/src/test/resources/org/apache/dubbo/config/spring/demo-provider-properties.xml @@ -15,23 +15,11 @@ limitations under the License. --> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" - xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd - http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> - <!-- current application configuration --> - <dubbo:application name="demo-provider"/> - - <!-- registry center configuration --> - <dubbo:registry address="N/A"/> - - <!-- service protocol configuration --> - <dubbo:protocol name="dubbo" port="20813"/> - - <!-- service configuration --> - <dubbo:service interface="org.apache.dubbo.config.spring.api.DemoService" ref="demoService"/> - - <bean id="demoService" class="org.apache.dubbo.config.spring.impl.DemoServiceImpl"/> + <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> + <property name="location" value="classpath:/META-INF/demo-provider.properties"/> + </bean> </beans> \ No newline at end of file diff --git a/dubbo-config/dubbo-config-spring/src/test/resources/org/apache/dubbo/config/spring/demo-provider.xml b/dubbo-config/dubbo-config-spring/src/test/resources/org/apache/dubbo/config/spring/demo-provider.xml index 0105571..d5d3c52 100644 --- a/dubbo-config/dubbo-config-spring/src/test/resources/org/apache/dubbo/config/spring/demo-provider.xml +++ b/dubbo-config/dubbo-config-spring/src/test/resources/org/apache/dubbo/config/spring/demo-provider.xml @@ -21,13 +21,13 @@ http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- current application configuration --> - <dubbo:application name="demo-provider"/> + <dubbo:application name="${dubbo.application.name}"/> <!-- registry center configuration --> - <dubbo:registry address="N/A"/> + <dubbo:registry address="${dubbo.registry.address}"/> <!-- service protocol configuration --> - <dubbo:protocol name="dubbo" port="20813"/> + <dubbo:protocol name="${dubbo.protocol.name}" port="${dubbo.protocol.port}"/> <!-- service configuration --> <dubbo:service interface="org.apache.dubbo.config.spring.api.DemoService" ref="demoService"/>