blob: 15055f7e53331a211bb8e1a0ba753829ef20bda1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.config.spring.beans.factory.annotation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.dubbo.config.AbstractInterfaceConfig;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ModuleConfig;
import org.apache.dubbo.config.MonitorConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.util.Assert;
import java.lang.annotation.Annotation;
import java.util.List;
import static org.apache.dubbo.config.spring.util.DubboBeanUtils.getBeans;
import static org.apache.dubbo.config.spring.util.DubboBeanUtils.getOptionalBean;
/**
* An Abstract Builder to build {@link AbstractInterfaceConfig Interface Config} Bean that annotated
* some {@link Annotation annotation}.
*
* @see ReferenceBeanBuilder
* @see AbstractInterfaceConfig
* @see AnnotationAttributes
* @since 2.7.3
*/
public abstract class AnnotatedInterfaceConfigBeanBuilder<C extends AbstractInterfaceConfig> {
protected final Log logger = LogFactory.getLog(getClass());
protected final AnnotationAttributes attributes;
protected final ApplicationContext applicationContext;
protected final ClassLoader classLoader;
protected Object configBean;
protected Class<?> interfaceClass;
protected AnnotatedInterfaceConfigBeanBuilder(AnnotationAttributes attributes, ApplicationContext applicationContext) {
Assert.notNull(attributes, "The Annotation attributes must not be null!");
Assert.notNull(applicationContext, "The ApplicationContext must not be null!");
this.attributes = attributes;
this.applicationContext = applicationContext;
this.classLoader = applicationContext.getClassLoader() != null ?
applicationContext.getClassLoader() : Thread.currentThread().getContextClassLoader();
}
/**
* Build {@link C}
*
* @return non-null
* @throws Exception
*/
public final C build() throws Exception {
checkDependencies();
C configBean = doBuild();
configureBean(configBean);
if (logger.isInfoEnabled()) {
logger.info("The configBean[type:" + configBean.getClass().getSimpleName() + "] has been built.");
}
return configBean;
}
private void checkDependencies() {
}
/**
* Builds {@link C Bean}
*
* @return {@link C Bean}
*/
protected abstract C doBuild();
protected void configureBean(C configBean) throws Exception {
preConfigureBean(attributes, configBean);
configureRegistryConfigs(configBean);
configureMonitorConfig(configBean);
configureApplicationConfig(configBean);
configureModuleConfig(configBean);
postConfigureBean(attributes, configBean);
}
protected abstract void preConfigureBean(AnnotationAttributes attributes, C configBean) throws Exception;
private void configureRegistryConfigs(C configBean) {
String[] registryConfigBeanIds = resolveRegistryConfigBeanNames(attributes);
List<RegistryConfig> registryConfigs = getBeans(applicationContext, registryConfigBeanIds, RegistryConfig.class);
configBean.setRegistries(registryConfigs);
}
private void configureMonitorConfig(C configBean) {
String monitorBeanName = resolveMonitorConfigBeanName(attributes);
MonitorConfig monitorConfig = getOptionalBean(applicationContext, monitorBeanName, MonitorConfig.class);
configBean.setMonitor(monitorConfig);
}
private void configureApplicationConfig(C configBean) {
String applicationConfigBeanName = resolveApplicationConfigBeanName(attributes);
ApplicationConfig applicationConfig =
getOptionalBean(applicationContext, applicationConfigBeanName, ApplicationConfig.class);
configBean.setApplication(applicationConfig);
}
private void configureModuleConfig(C configBean) {
String moduleConfigBeanName = resolveModuleConfigBeanName(attributes);
ModuleConfig moduleConfig =
getOptionalBean(applicationContext, moduleConfigBeanName, ModuleConfig.class);
configBean.setModule(moduleConfig);
}
/**
* Resolves the configBean name of {@link ModuleConfig}
*
* @param attributes {@link AnnotationAttributes}
* @return
*/
protected abstract String resolveModuleConfigBeanName(AnnotationAttributes attributes);
/**
* Resolves the configBean name of {@link ApplicationConfig}
*
* @param attributes {@link AnnotationAttributes}
* @return
*/
protected abstract String resolveApplicationConfigBeanName(AnnotationAttributes attributes);
/**
* Resolves the configBean ids of {@link RegistryConfig}
*
* @param attributes {@link AnnotationAttributes}
* @return non-empty array
*/
protected abstract String[] resolveRegistryConfigBeanNames(AnnotationAttributes attributes);
/**
* Resolves the configBean name of {@link MonitorConfig}
*
* @param attributes {@link AnnotationAttributes}
* @return
*/
protected abstract String resolveMonitorConfigBeanName(AnnotationAttributes attributes);
/**
* Configures Bean
*
* @param attributes
* @param configBean
*/
protected abstract void postConfigureBean(AnnotationAttributes attributes, C configBean) throws Exception;
public <T extends AnnotatedInterfaceConfigBeanBuilder<C>> T configBean(Object configBean) {
this.configBean = configBean;
return (T) this;
}
public <T extends AnnotatedInterfaceConfigBeanBuilder<C>> T interfaceClass(Class<?> interfaceClass) {
this.interfaceClass = interfaceClass;
return (T) this;
}
}