package com.alibaba.dubbo.spring.boot; import java.util.Map; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import com.alibaba.dubbo.config.annotation.Service; import com.alibaba.dubbo.config.spring.ServiceBean; import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration; /** * DubboProviderAutoConfiguration * * @author xionghui * @author 韩旺坤 * @version 2.0.0 * @since 1.0.0 */ @Configuration @ConditionalOnClass(Service.class) @ConditionalOnBean(annotation = EnableDubboConfiguration.class) @AutoConfigureAfter(DubboAutoConfiguration.class) @EnableConfigurationProperties(DubboProperties.class) public class DubboProviderAutoConfiguration extends DubboCommonAutoConfiguration { @Autowired private ApplicationContext applicationContext; @Autowired private DubboProperties properties; @PostConstruct public void init() throws Exception { Map<String, Object> beanMap = this.applicationContext.getBeansWithAnnotation(Service.class); if (beanMap != null && beanMap.size() > 0) { this.initIdConfigMap(this.properties); for (Map.Entry<String, Object> entry : beanMap.entrySet()) { this.initProviderBean(entry.getKey(), entry.getValue()); } } } private void initProviderBean(String beanName, Object bean) throws Exception { Service service = this.applicationContext.findAnnotationOnBean(beanName, Service.class); ServiceBean<Object> serviceConfig = new ServiceBean<Object>(service); if ((service.interfaceClass() == null || service.interfaceClass() == void.class) && (service.interfaceName() == null || "".equals(service.interfaceName()))) { Class<?>[] interfaces = bean.getClass().getInterfaces(); if (interfaces.length > 0) { serviceConfig.setInterface(interfaces[0]); } } Environment environment = this.applicationContext.getEnvironment(); String application = service.application(); serviceConfig.setApplication(this.parseApplication(application, this.properties, environment, beanName, "application", application)); String module = service.module(); serviceConfig.setModule( this.parseModule(module, this.properties, environment, beanName, "module", module)); String[] registries = service.registry(); serviceConfig.setRegistries( this.parseRegistries(registries, this.properties, environment, beanName, "registry")); String[] protocols = service.protocol(); serviceConfig.setProtocols( this.parseProtocols(protocols, this.properties, environment, beanName, "registry")); String monitor = service.monitor(); serviceConfig.setMonitor( this.parseMonitor(monitor, this.properties, environment, beanName, "monitor", monitor)); String provider = service.provider(); serviceConfig.setProvider( this.parseProvider(provider, this.properties, environment, beanName, "provider", provider)); serviceConfig.setApplicationContext(this.applicationContext); serviceConfig.afterPropertiesSet(); serviceConfig.setRef(bean); serviceConfig.export(); } @Override protected String buildErrorMsg(String... errors) { if (errors == null || errors.length != 3) { return super.buildErrorMsg(errors); } return new StringBuilder().append("beanName=").append(errors[0]).append(", ").append(errors[1]) .append("=").append(errors[2]).append(" not found in multi configs").toString(); } }