@Override
	public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
		// 根据tpURL获取标识码
		final String serviceKey = getServiceKey(invoker.getTpURL());
		// 通过标识码在缓存中找相应的Exporter
		Exporter<T> exporter = (Exporter<T>) exporterMap.get(serviceKey);
		if (exporter != null) {
			return exporter;
		}
		// 若不存在则新生成
		// 生成 invoker 对应 具有服务实际执行能力的实体类代理
		T exportProxy = proxyFactory.getProxy(invoker);
		// 发布Invoker 返回一个 取消发布的命令
		final Runnable unexportCommand = doExport(exportProxy, invoker.getInterface(), invoker.getTpURL());
		exporter = new AbstractExporter<T>(invoker) {
			public void unexport() {
				super.unexport();
				// 从已发布Exporter的缓存中去除
				exporterMap.remove(serviceKey);
				if (unexportCommand != null) {
					try {
						// 执行取消发布的命令
						unexportCommand.run();
					} catch (Throwable t) {
						logger.warn(t.getMessage(), t);
					}
				}
			}
		};
		// 放入缓存
		exporterMap.putIfAbsent(serviceKey, exporter);
		return exporter;
	}