package message.amqp.configs.parser; import message.config.SystemConfig; import message.template.resource.ThymeleafTemplateResource; import message.utils.PropertyPlaceholderHelper; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionReader; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.io.Resource; import org.w3c.dom.Element; import java.util.HashMap; import java.util.Map; /** * RabbitMq配置的处理. * * @author sunhao(sunhao.java@gmail.com) * @version V1.0, 14-8-10 上午1:39 */ public class RabbitMqParser implements BeanDefinitionParser { @Override public BeanDefinition parse(Element element, ParserContext parserContext) { //bean对象注册机 BeanDefinitionRegistry registry = parserContext.getRegistry(); dynamicLoadConfigBean(element, registry); return null; } private void dynamicLoadConfigBean(Element element, BeanDefinitionRegistry registry) { BeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(registry); //判断上下文中是否存在 boolean isExist = registry.containsBeanDefinition("rabbitConnectionFactory"); if (isExist) return; beanDefinitionReader.loadBeanDefinitions(this.getConfigFileResource("META-INF/template/amqp.xml", getConfigs(element))); } private Resource getConfigFileResource(String templatePath, Map<String, String> context) { Resource resource = new ThymeleafTemplateResource(templatePath, context, "xml"); return resource; } /** * 获取配置文件中的字段 * * @param element * @return */ protected Map<String, String> getConfigs(Element element) { String address = element.getAttribute("addresses"); String username = element.getAttribute("username"); String password = element.getAttribute("password"); String exchange = element.getAttribute("exchange"); Map<String, String> params = new HashMap<String, String>(); params.put("addresses", PropertyPlaceholderHelper.replacePlaceholder(address, false, SystemConfig.getAllConfigs())); params.put("username", PropertyPlaceholderHelper.replacePlaceholder(username, false, SystemConfig.getAllConfigs())); params.put("password", PropertyPlaceholderHelper.replacePlaceholder(password, false, SystemConfig.getAllConfigs())); params.put("exchange", PropertyPlaceholderHelper.replacePlaceholder(exchange, false, SystemConfig.getAllConfigs())); return params; } }