From bfbae581d7f91b690a926debfbf8f34b64203581 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 23 May 2023 15:48:25 -0700 Subject: [PATCH] Extract BindMethodAttribute class Create a `BindMethodAttribute` class to manage attribute logic. Closes gh-35638 --- .../properties/BindMethodAttribute.java | 61 +++++++++++++++++++ .../ConfigurationPropertiesBean.java | 12 +--- .../ConfigurationPropertiesBeanRegistrar.java | 2 +- ...ropertiesBeanRegistrationAotProcessor.java | 8 +-- ...urationPropertiesBindingPostProcessor.java | 3 +- 5 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/BindMethodAttribute.java diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/BindMethodAttribute.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/BindMethodAttribute.java new file mode 100644 index 0000000000..06dfdc75bb --- /dev/null +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/BindMethodAttribute.java @@ -0,0 +1,61 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed 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 + * + * https://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.springframework.boot.context.properties; + +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.boot.context.properties.ConfigurationPropertiesBean.BindMethod; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.AttributeAccessor; + +/** + * Allows a {@link BindMethod} value to be stored and retrieved from an + * {@link AttributeAccessor}. + * + * @author Phillip Webb + */ +final class BindMethodAttribute { + + static final String NAME = BindMethod.class.getName(); + + private BindMethodAttribute() { + } + + static BindMethod get(ApplicationContext applicationContext, String beanName) { + return (applicationContext instanceof ConfigurableApplicationContext configurableApplicationContext) + ? get(configurableApplicationContext.getBeanFactory(), beanName) : null; + } + + static BindMethod get(ConfigurableListableBeanFactory beanFactory, String beanName) { + return (!beanFactory.containsBeanDefinition(beanName)) ? null : get(beanFactory.getBeanDefinition(beanName)); + } + + static BindMethod get(BeanDefinitionRegistry beanDefinitionRegistry, String beanName) { + return (!beanDefinitionRegistry.containsBeanDefinition(beanName)) ? null + : get(beanDefinitionRegistry.getBeanDefinition(beanName)); + } + + static BindMethod get(AttributeAccessor attributes) { + return (BindMethod) attributes.getAttribute(NAME); + } + + static void set(AttributeAccessor attributes, BindMethod bindMethod) { + attributes.setAttribute(NAME, bindMethod); + } + +} diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBean.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBean.java index d3396f7c4f..1c24fa0ac5 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBean.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBean.java @@ -163,7 +163,7 @@ public final class ConfigurationPropertiesBean { if (isConfigurationPropertiesBean(beanFactory, beanName)) { try { Object bean = beanFactory.getBean(beanName); - BindMethod bindMethod = getBindMethod(beanFactory, beanName); + BindMethod bindMethod = BindMethodAttribute.get(beanFactory, beanName); ConfigurationPropertiesBean propertiesBean = get(applicationContext, bean, beanName, bindMethod); if (propertiesBean != null) { propertiesBeans.put(beanName, propertiesBean); @@ -176,16 +176,6 @@ public final class ConfigurationPropertiesBean { return propertiesBeans; } - private static BindMethod getBindMethod(ConfigurableListableBeanFactory beanFactory, String beanName) { - try { - BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); - return (BindMethod) beanDefinition.getAttribute(BindMethod.class.getName()); - } - catch (NoSuchBeanDefinitionException ex) { - return null; - } - } - private static boolean isConfigurationPropertiesBean(ConfigurableListableBeanFactory beanFactory, String beanName) { try { if (beanFactory.getBeanDefinition(beanName).isAbstract()) { diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar.java index 875d5ae37f..eead4a5a75 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar.java @@ -92,7 +92,7 @@ final class ConfigurationPropertiesBeanRegistrar { private BeanDefinition createBeanDefinition(String beanName, Class type) { BindMethod bindMethod = BindMethod.get(type); RootBeanDefinition definition = new RootBeanDefinition(type); - definition.setAttribute(BindMethod.class.getName(), bindMethod); + BindMethodAttribute.set(definition, bindMethod); if (bindMethod == BindMethod.VALUE_OBJECT) { definition.setInstanceSupplier(() -> ConstructorBound.from(this.beanFactory, beanName, type)); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrationAotProcessor.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrationAotProcessor.java index b0392723cf..7f4890a937 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrationAotProcessor.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrationAotProcessor.java @@ -56,16 +56,12 @@ class ConfigurationPropertiesBeanRegistrationAotProcessor implements BeanRegistr } private boolean isImmutableConfigurationPropertiesBeanDefinition(BeanDefinition beanDefinition) { - return beanDefinition.hasAttribute(BindMethod.class.getName()) - && BindMethod.VALUE_OBJECT.equals(beanDefinition.getAttribute(BindMethod.class.getName())); + return BindMethod.VALUE_OBJECT.equals(BindMethodAttribute.get(beanDefinition)); } private static class ConfigurationPropertiesBeanRegistrationCodeFragments extends BeanRegistrationCodeFragmentsDecorator { - private static final Predicate INCLUDE_BIND_METHOD_ATTRIBUTE_FILTER = (name) -> name - .equals(BindMethod.class.getName()); - private static final String REGISTERED_BEAN_PARAMETER_NAME = "registeredBean"; private final RegisteredBean registeredBean; @@ -81,7 +77,7 @@ class ConfigurationPropertiesBeanRegistrationAotProcessor implements BeanRegistr BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition, Predicate attributeFilter) { return super.generateSetBeanDefinitionPropertiesCode(generationContext, beanRegistrationCode, - beanDefinition, INCLUDE_BIND_METHOD_ATTRIBUTE_FILTER.or(attributeFilter)); + beanDefinition, attributeFilter.or(BindMethodAttribute.NAME::equals)); } @Override diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessor.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessor.java index 3134b2d218..a0f5772de9 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessor.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessor.java @@ -82,8 +82,7 @@ public class ConfigurationPropertiesBindingPostProcessor } private boolean hasBoundValueObject(String beanName) { - return this.registry.containsBeanDefinition(beanName) && BindMethod.VALUE_OBJECT - .equals(this.registry.getBeanDefinition(beanName).getAttribute(BindMethod.class.getName())); + return BindMethod.VALUE_OBJECT.equals(BindMethodAttribute.get(this.registry, beanName)); } private void bind(ConfigurationPropertiesBean bean) {