|
|
|
|
@ -40,7 +40,9 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory;
@@ -40,7 +40,9 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
|
|
|
|
import org.springframework.beans.factory.support.RootBeanDefinition; |
|
|
|
|
import org.springframework.core.MethodIntrospector; |
|
|
|
|
import org.springframework.core.ResolvableType; |
|
|
|
|
import org.springframework.core.log.LogMessage; |
|
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
|
import org.springframework.util.Assert; |
|
|
|
|
import org.springframework.util.ObjectUtils; |
|
|
|
|
import org.springframework.util.ReflectionUtils; |
|
|
|
|
|
|
|
|
|
@ -66,8 +68,6 @@ public final class BeanDefinitionRegistrar {
@@ -66,8 +68,6 @@ public final class BeanDefinitionRegistrar {
|
|
|
|
|
@Nullable |
|
|
|
|
private final ResolvableType beanType; |
|
|
|
|
|
|
|
|
|
private final BeanDefinitionBuilder builder; |
|
|
|
|
|
|
|
|
|
private final List<Consumer<RootBeanDefinition>> customizers; |
|
|
|
|
|
|
|
|
|
@Nullable |
|
|
|
|
@ -81,11 +81,9 @@ public final class BeanDefinitionRegistrar {
@@ -81,11 +81,9 @@ public final class BeanDefinitionRegistrar {
|
|
|
|
|
this.beanName = beanName; |
|
|
|
|
this.beanClass = beanClass; |
|
|
|
|
this.beanType = beanType; |
|
|
|
|
this.builder = BeanDefinitionBuilder.rootBeanDefinition(beanClass); |
|
|
|
|
this.customizers = new ArrayList<>(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Initialize the registration of a bean with the specified name and type. |
|
|
|
|
* @param beanName the name of the bean |
|
|
|
|
@ -124,16 +122,6 @@ public final class BeanDefinitionRegistrar {
@@ -124,16 +122,6 @@ public final class BeanDefinitionRegistrar {
|
|
|
|
|
return new BeanDefinitionRegistrar(null, beanType, null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Customize the {@link RootBeanDefinition} using the specified consumer. |
|
|
|
|
* @param bd a consumer for the bean definition |
|
|
|
|
* @return {@code this}, to facilitate method chaining |
|
|
|
|
*/ |
|
|
|
|
public BeanDefinitionRegistrar customize(ThrowableConsumer<RootBeanDefinition> bd) { |
|
|
|
|
this.customizers.add(bd); |
|
|
|
|
return this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Specify the factory method to use to instantiate the bean. |
|
|
|
|
* @param declaredType the {@link Method#getDeclaringClass() declared type} |
|
|
|
|
@ -177,19 +165,25 @@ public final class BeanDefinitionRegistrar {
@@ -177,19 +165,25 @@ public final class BeanDefinitionRegistrar {
|
|
|
|
|
return customize(beanDefinition -> beanDefinition.setInstanceSupplier(instanceSupplier)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Customize the {@link RootBeanDefinition} using the specified consumer. |
|
|
|
|
* @param bd a consumer for the bean definition |
|
|
|
|
* @return {@code this}, to facilitate method chaining |
|
|
|
|
*/ |
|
|
|
|
public BeanDefinitionRegistrar customize(ThrowableConsumer<RootBeanDefinition> bd) { |
|
|
|
|
this.customizers.add(bd); |
|
|
|
|
return this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Register the {@link RootBeanDefinition} defined by this instance to |
|
|
|
|
* the specified bean factory. |
|
|
|
|
* @param beanFactory the bean factory to use |
|
|
|
|
*/ |
|
|
|
|
public void register(DefaultListableBeanFactory beanFactory) { |
|
|
|
|
if (logger.isDebugEnabled()) { |
|
|
|
|
logger.debug("Register bean definition with name '" + this.beanName + "'"); |
|
|
|
|
} |
|
|
|
|
BeanDefinition beanDefinition = toBeanDefinition(); |
|
|
|
|
if (this.beanName == null) { |
|
|
|
|
throw new IllegalStateException("Bean name not set. Could not register " + beanDefinition); |
|
|
|
|
} |
|
|
|
|
Assert.state(this.beanName != null, () -> "Bean name not set. Could not register " + beanDefinition); |
|
|
|
|
logger.debug(LogMessage.format("Register bean definition with name '%s'", this.beanName)); |
|
|
|
|
beanFactory.registerBeanDefinition(this.beanName, beanDefinition); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -208,7 +202,8 @@ public final class BeanDefinitionRegistrar {
@@ -208,7 +202,8 @@ public final class BeanDefinitionRegistrar {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private RootBeanDefinition createBeanDefinition() { |
|
|
|
|
RootBeanDefinition bd = (RootBeanDefinition) this.builder.getBeanDefinition(); |
|
|
|
|
RootBeanDefinition bd = (RootBeanDefinition) BeanDefinitionBuilder |
|
|
|
|
.rootBeanDefinition(this.beanClass).getBeanDefinition(); |
|
|
|
|
if (this.beanType != null) { |
|
|
|
|
bd.setTargetType(this.beanType); |
|
|
|
|
} |
|
|
|
|
@ -259,6 +254,7 @@ public final class BeanDefinitionRegistrar {
@@ -259,6 +254,7 @@ public final class BeanDefinitionRegistrar {
|
|
|
|
|
return Arrays.stream(parameterTypes).map(Class::getName).collect(Collectors.joining(", ")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Callback interface used by instance suppliers that need to resolve |
|
|
|
|
* dependencies for the {@link Executable} used to create the instance |
|
|
|
|
@ -276,9 +272,9 @@ public final class BeanDefinitionRegistrar {
@@ -276,9 +272,9 @@ public final class BeanDefinitionRegistrar {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return a bean instance using the specified {@code factory}. |
|
|
|
|
* Return the bean instance using the {@code factory}. |
|
|
|
|
* @param beanFactory the bean factory to use |
|
|
|
|
* @param factory a function that returns a bean instance based on |
|
|
|
|
* @param factory a function that returns the bean instance based on |
|
|
|
|
* the resolved attributes required by its instance creator |
|
|
|
|
* @param <T> the type of the bean |
|
|
|
|
* @return the bean instance |
|
|
|
|
@ -321,9 +317,7 @@ public final class BeanDefinitionRegistrar {
@@ -321,9 +317,7 @@ public final class BeanDefinitionRegistrar {
|
|
|
|
|
|
|
|
|
|
private Field getField(String fieldName, Class<?> fieldType) { |
|
|
|
|
Field field = ReflectionUtils.findField(this.beanType, fieldName, fieldType); |
|
|
|
|
if (field == null) { |
|
|
|
|
throw new IllegalArgumentException("No field '" + fieldName + "' with type " + fieldType.getName() + " found on " + this.beanType); |
|
|
|
|
} |
|
|
|
|
Assert.notNull(field, () -> "No field '" + fieldName + "' with type " + fieldType.getName() + " found on " + this.beanType); |
|
|
|
|
return field; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|