package org.springframework.cloud.config.java;
import java.util.Properties;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.SingletonBeanRegistry;
import org.springframework.cloud.Cloud;
import org.springframework.cloud.CloudFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* JavaConfig base class for simplified access to the bound services.
*
* Note that this class doesn't directly expose low-level methods such as getServiceInfo()
* to keep focus on typical needs of a Spring application. But, since it exposes the cloud object itself,
* you can always call methods on it to get that kind of information.
*
* @author Ramnivas Laddad
*
*/
@Configuration
public abstract class AbstractCloudConfig implements BeanFactoryAware {
private static final String CLOUD_FACTORY_BEAN_NAME = "__cloud_factory__";
private CloudFactory cloudFactory;
private Cloud cloud;
private ServiceConnectionFactory connectionFactory;
/**
* Get the cloud factory.
*
* Most applications will never need this method, but provided here to cover corner cases.
*
* @return cloud factory
*/
protected CloudFactory cloudFactory() {
return cloudFactory;
}
/**
* Get the underlying cloud object.
*
* @return the cloud object appropriate for the current environment
*/
@Bean
public Cloud cloud() {
return cloud;
}
public ServiceConnectionFactory connectionFactory() {
return connectionFactory;
}
/**
* Get the object containing service and app properties
*
* @return the properties of the discovered runtime environment
*/
public Properties properties() {
return cloud().getCloudProperties();
}
/**
* Implementation note: This roundabout way of implementation is required to ensure that
* a {@link CloudFactory} bean if created in some other configuration is available, we should use
* that.
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
if (cloudFactory == null) {
try {
cloudFactory = beanFactory.getBean(CloudFactory.class);
} catch (NoSuchBeanDefinitionException ex) {
cloudFactory = new CloudFactory();
((SingletonBeanRegistry) beanFactory).registerSingleton(CLOUD_FACTORY_BEAN_NAME, cloudFactory);
}
}
this.cloud = cloudFactory.getCloud();
this.connectionFactory = new CloudServiceConnectionFactory(cloud);
}
}