整体流程:
标签管理:com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
public class DubboNamespaceHandler extends NamespaceHandlerSupport {
static {
Version.checkDuplicate(DubboNamespaceHandler.class);
}
@Override
public void init() {
registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());
}
}
ServiceBean:com.alibaba.dubbo.config.spring.ServiceBean
serviceBean在容器创建完对象后调用 afterPropertiesSet方法,还会在IOC容器创建启动完成后调用onApplicationEvent方法
// 主要实现了InitializingBean 和 ApplicationListener两个接口
public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean,
ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware,
ApplicationEventPublisherAware {
......
}
// 只有一个主要的方法:属性赋值后会回调该方法
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
// 所用IOC容器中所有对象创建完成后会回调该方法
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
void onApplicationEvent(E event);
}
调用afterPropertiesSer方法给每个对象赋值:
// config为provide和consume的配置文件标签内容
for (ApplicationConfig config : applicationConfigMap.values()) {
if (config.isDefault() == null || config.isDefault().booleanValue()) {
if (applicationConfig != null) {
throw new IllegalStateException("Duplicate application configs: " + applicationConfig + " and " + config);
}
applicationConfig = config;
}
}
......
moduleConfig = config;
registryConfigs.add(config);
monitorConfig = config;
protocolConfigs.add(config);
......
调用onApplicationEvent方法来暴露服务:SpringIOC容器创建完成后触发的contextRefreshedEvent事件,export暴露服务
// export 非延迟的,需要暴露但是还未暴露的服务
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (isDelay() && !isExported() && !isUnexported()) {
if (logger.isInfoEnabled()) {
logger.info("The service ready on spring started. service: " + getInterface());
}
export();
}
}
export方法会进行一系列参数校验,然后调用到ServiceConfig的doExportUrls方法:工厂模式
private void doExportUrls() {
List<URL> registryURLs = loadRegistries(true);
for (ProtocolConfig protocolConfig : protocols) {
doExportUrlsFor1Protocol(protocolConfig, registryURLs);
}
}
......
//doExportUrlsFor1Protocol方法核心内容
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);
Exporter<?> exporter = protocol.export(wrapperInvoker);
exporters.add(exporter);
protocol的export,redistryProtocol的export ......
// 例如:RegistryProtocol的export方法
//ProviderConsumerRegTable : 提供者和消费者的注册表
// 入参:originInvoker提供者,registryUrl注册中心的地址,registeredProviderUrl提供者的地址
ProviderConsumerRegTable.registerProvider(originInvoker, registryUrl, registeredProviderUrl);
DubboProtocol的export
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
......
// 打开服务器,即启动netty服务器,监控注册的端口
openServer(url);
optimizeSerialization(url);
......
}