This commit is contained in:
Madhura Bhave 2018-02-07 13:20:57 -08:00
parent 7d53c54364
commit dd3bcc5691
4 changed files with 30 additions and 29 deletions

View File

@ -47,7 +47,7 @@ import org.springframework.beans.BeansException;
import org.springframework.boot.actuate.endpoint.Sanitizer; import org.springframework.boot.actuate.endpoint.Sanitizer;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData; import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextAware;
@ -107,15 +107,15 @@ public class ConfigurationPropertiesReportEndpoint implements ApplicationContext
private ContextConfigurationProperties describeConfigurationProperties( private ContextConfigurationProperties describeConfigurationProperties(
ApplicationContext context, ObjectMapper mapper) { ApplicationContext context, ObjectMapper mapper) {
ConfigurationBeanFactoryMetaData beanFactoryMetaData = getBeanFactoryMetaData( ConfigurationBeanFactoryMetadata beanFactoryMetadata = getBeanFactoryMetadata(
context); context);
Map<String, Object> beans = getConfigurationPropertiesBeans(context, Map<String, Object> beans = getConfigurationPropertiesBeans(context,
beanFactoryMetaData); beanFactoryMetadata);
Map<String, ConfigurationPropertiesBeanDescriptor> beanDescriptors = new HashMap<>(); Map<String, ConfigurationPropertiesBeanDescriptor> beanDescriptors = new HashMap<>();
for (Map.Entry<String, Object> entry : beans.entrySet()) { for (Map.Entry<String, Object> entry : beans.entrySet()) {
String beanName = entry.getKey(); String beanName = entry.getKey();
Object bean = entry.getValue(); Object bean = entry.getValue();
String prefix = extractPrefix(context, beanFactoryMetaData, beanName); String prefix = extractPrefix(context, beanFactoryMetadata, beanName);
beanDescriptors.put(beanName, new ConfigurationPropertiesBeanDescriptor( beanDescriptors.put(beanName, new ConfigurationPropertiesBeanDescriptor(
prefix, sanitize(prefix, safeSerialize(mapper, bean, prefix)))); prefix, sanitize(prefix, safeSerialize(mapper, bean, prefix))));
} }
@ -123,10 +123,10 @@ public class ConfigurationPropertiesReportEndpoint implements ApplicationContext
context.getParent() == null ? null : context.getParent().getId()); context.getParent() == null ? null : context.getParent().getId());
} }
private ConfigurationBeanFactoryMetaData getBeanFactoryMetaData( private ConfigurationBeanFactoryMetadata getBeanFactoryMetadata(
ApplicationContext context) { ApplicationContext context) {
Map<String, ConfigurationBeanFactoryMetaData> beans = context Map<String, ConfigurationBeanFactoryMetadata> beans = context
.getBeansOfType(ConfigurationBeanFactoryMetaData.class); .getBeansOfType(ConfigurationBeanFactoryMetadata.class);
if (beans.size() == 1) { if (beans.size() == 1) {
return beans.values().iterator().next(); return beans.values().iterator().next();
} }
@ -135,11 +135,11 @@ public class ConfigurationPropertiesReportEndpoint implements ApplicationContext
private Map<String, Object> getConfigurationPropertiesBeans( private Map<String, Object> getConfigurationPropertiesBeans(
ApplicationContext context, ApplicationContext context,
ConfigurationBeanFactoryMetaData beanFactoryMetaData) { ConfigurationBeanFactoryMetadata beanFactoryMetadata) {
Map<String, Object> beans = new HashMap<>(); Map<String, Object> beans = new HashMap<>();
beans.putAll(context.getBeansWithAnnotation(ConfigurationProperties.class)); beans.putAll(context.getBeansWithAnnotation(ConfigurationProperties.class));
if (beanFactoryMetaData != null) { if (beanFactoryMetadata != null) {
beans.putAll(beanFactoryMetaData beans.putAll(beanFactoryMetadata
.getBeansWithFactoryAnnotation(ConfigurationProperties.class)); .getBeansWithFactoryAnnotation(ConfigurationProperties.class));
} }
return beans; return beans;
@ -204,7 +204,7 @@ public class ConfigurationPropertiesReportEndpoint implements ApplicationContext
* @return the prefix * @return the prefix
*/ */
private String extractPrefix(ApplicationContext context, private String extractPrefix(ApplicationContext context,
ConfigurationBeanFactoryMetaData beanFactoryMetaData, String beanName) { ConfigurationBeanFactoryMetadata beanFactoryMetaData, String beanName) {
ConfigurationProperties annotation = context.findAnnotationOnBean(beanName, ConfigurationProperties annotation = context.findAnnotationOnBean(beanName,
ConfigurationProperties.class); ConfigurationProperties.class);
if (beanFactoryMetaData != null) { if (beanFactoryMetaData != null) {

View File

@ -27,6 +27,7 @@ import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
/** /**
@ -36,11 +37,11 @@ import org.springframework.util.ReflectionUtils;
* @author Dave Syer * @author Dave Syer
* @since 1.1.0 * @since 1.1.0
*/ */
public class ConfigurationBeanFactoryMetaData implements BeanFactoryPostProcessor { public class ConfigurationBeanFactoryMetadata implements BeanFactoryPostProcessor {
private ConfigurableListableBeanFactory beanFactory; private ConfigurableListableBeanFactory beanFactory;
private final Map<String, MetaData> beans = new HashMap<>(); private final Map<String, FactoryMetadata> beansFactoryMetadata = new HashMap<>();
@Override @Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
@ -51,7 +52,7 @@ public class ConfigurationBeanFactoryMetaData implements BeanFactoryPostProcesso
String method = definition.getFactoryMethodName(); String method = definition.getFactoryMethodName();
String bean = definition.getFactoryBeanName(); String bean = definition.getFactoryBeanName();
if (method != null && bean != null) { if (method != null && bean != null) {
this.beans.put(name, new MetaData(bean, method)); this.beansFactoryMetadata.put(name, new FactoryMetadata(bean, method));
} }
} }
} }
@ -59,7 +60,7 @@ public class ConfigurationBeanFactoryMetaData implements BeanFactoryPostProcesso
public <A extends Annotation> Map<String, Object> getBeansWithFactoryAnnotation( public <A extends Annotation> Map<String, Object> getBeansWithFactoryAnnotation(
Class<A> type) { Class<A> type) {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
for (String name : this.beans.keySet()) { for (String name : this.beansFactoryMetadata.keySet()) {
if (findFactoryAnnotation(name, type) != null) { if (findFactoryAnnotation(name, type) != null) {
result.put(name, this.beanFactory.getBean(name)); result.put(name, this.beanFactory.getBean(name));
} }
@ -73,29 +74,29 @@ public class ConfigurationBeanFactoryMetaData implements BeanFactoryPostProcesso
return (method == null ? null : AnnotationUtils.findAnnotation(method, type)); return (method == null ? null : AnnotationUtils.findAnnotation(method, type));
} }
private Method findFactoryMethod(String beanName) { public Method findFactoryMethod(String beanName) {
if (!this.beans.containsKey(beanName)) { if (!this.beansFactoryMetadata.containsKey(beanName)) {
return null; return null;
} }
final AtomicReference<Method> found = new AtomicReference<>(null); AtomicReference<Method> found = new AtomicReference<>(null);
MetaData meta = this.beans.get(beanName); FactoryMetadata metadata = this.beansFactoryMetadata.get(beanName);
final String factory = meta.getMethod(); Class<?> factoryType = this.beanFactory.getType(metadata.getBean());
Class<?> type = this.beanFactory.getType(meta.getBean()); String factoryMethod = metadata.getMethod();
ReflectionUtils.doWithMethods(type, (method) -> { ReflectionUtils.doWithMethods(factoryType, (method) -> {
if (method.getName().equals(factory)) { if (method.getName().equals(factoryMethod)) {
found.compareAndSet(null, method); found.compareAndSet(null, method);
} }
}); });
return found.get(); return found.get();
} }
private static class MetaData { private static class FactoryMetadata {
private final String bean; private final String bean;
private final String method; private final String method;
MetaData(String bean, String method) { FactoryMetadata(String bean, String method) {
this.bean = bean; this.bean = bean;
this.method = method; this.method = method;
} }

View File

@ -63,7 +63,7 @@ public class ConfigurationPropertiesBindingPostProcessor
private static final Log logger = LogFactory private static final Log logger = LogFactory
.getLog(ConfigurationPropertiesBindingPostProcessor.class); .getLog(ConfigurationPropertiesBindingPostProcessor.class);
private ConfigurationBeanFactoryMetaData beans = new ConfigurationBeanFactoryMetaData(); private ConfigurationBeanFactoryMetadata beans = new ConfigurationBeanFactoryMetadata();
private BeanFactory beanFactory; private BeanFactory beanFactory;
@ -88,7 +88,7 @@ public class ConfigurationPropertiesBindingPostProcessor
* Set the bean meta-data store. * Set the bean meta-data store.
* @param beans the bean meta data store * @param beans the bean meta data store
*/ */
public void setBeanMetaDataStore(ConfigurationBeanFactoryMetaData beans) { public void setBeanMetadataStore(ConfigurationBeanFactoryMetadata beans) {
this.beans = beans; this.beans = beans;
} }

View File

@ -44,10 +44,10 @@ public class ConfigurationPropertiesBindingPostProcessorRegistrar
BeanDefinitionRegistry registry) { BeanDefinitionRegistry registry) {
if (!registry.containsBeanDefinition(BINDER_BEAN_NAME)) { if (!registry.containsBeanDefinition(BINDER_BEAN_NAME)) {
BeanDefinitionBuilder meta = BeanDefinitionBuilder BeanDefinitionBuilder meta = BeanDefinitionBuilder
.genericBeanDefinition(ConfigurationBeanFactoryMetaData.class); .genericBeanDefinition(ConfigurationBeanFactoryMetadata.class);
BeanDefinitionBuilder bean = BeanDefinitionBuilder.genericBeanDefinition( BeanDefinitionBuilder bean = BeanDefinitionBuilder.genericBeanDefinition(
ConfigurationPropertiesBindingPostProcessor.class); ConfigurationPropertiesBindingPostProcessor.class);
bean.addPropertyReference("beanMetaDataStore", METADATA_BEAN_NAME); bean.addPropertyReference("beanMetadataStore", METADATA_BEAN_NAME);
registry.registerBeanDefinition(BINDER_BEAN_NAME, bean.getBeanDefinition()); registry.registerBeanDefinition(BINDER_BEAN_NAME, bean.getBeanDefinition());
registry.registerBeanDefinition(METADATA_BEAN_NAME, meta.getBeanDefinition()); registry.registerBeanDefinition(METADATA_BEAN_NAME, meta.getBeanDefinition());
} }