Spring - BeanDefinition

98 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


BeanDefinition

BeanDefinition

定义 Bean 的配置元信息接口

package org.springframework.beans.factory.config;

import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.core.AttributeAccessor;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

   String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;

   String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

   int ROLE_APPLICATION = 0;

   int ROLE_SUPPORT = 1;

   int ROLE_INFRASTRUCTURE = 2;

   void setParentName(@Nullable String parentName);

   @Nullable
   String getParentName();

   // beanClass:表示Bean类型,未加载类的时候存放Bean的名字,加载类后存放Bean的class信息。
   void setBeanClassName(@Nullable String beanClassName);

   // scope:表示Bean的作用域,一般值为单例或者原型。
   void setScope(@Nullable String scope);

   // lazyInit:表示Bean是否是懒加载。
   void setLazyInit(boolean lazyInit);

   void setDependsOn(@Nullable String... dependsOn);

   @Nullable
   String[] getDependsOn();

   void setAutowireCandidate(boolean autowireCandidate);

   boolean isAutowireCandidate();

   void setPrimary(boolean primary);

   boolean isPrimary();

   // factoryBeanName:创建当前Bean的工厂Bean。
   void setFactoryBeanName(@Nullable String factoryBeanName);

   void setFactoryMethodName(@Nullable String factoryMethodName);

   
   @Nullable
   String getFactoryMethodName();

   ConstructorArgumentValues getConstructorArgumentValues();

   default boolean hasConstructorArgumentValues() {
      return !getConstructorArgumentValues().isEmpty();
   }

   MutablePropertyValues getPropertyValues();

   default boolean hasPropertyValues() {
      return !getPropertyValues().isEmpty();
   }

   // initMethodName:Bean初始化需要执行的方法。
   void setInitMethodName(@Nullable String initMethodName);

   // destroyMethodName:Bean销毁时要执行的方法。
   void setDestroyMethodName(@Nullable String destroyMethodName);

   @Nullable
   String getDestroyMethodName();

   
   void setRole(int role);

   int getRole();

   void setDescription(@Nullable String description);

   @Nullable
   String getDescription();

   ResolvableType getResolvableType();

   boolean isSingleton();

   boolean isPrototype();

   boolean isAbstract();

   @Nullable
   String getResourceDescription();

   @Nullable
   BeanDefinition getOriginatingBeanDefinition();

}

AbstractBeanDefinition

实现BeanDefinition接口,支撑BeaDefinition接口提供的所有方法。

GenericBeanDefinition

AbstractBeanDefinition 多一个 parentName

@Nullable
private String parentName;

构建BeanDefinition

Spring中构建BeanDefinition的两种方法:

  1. BeanDefinitionBuilder
  2. GenericBeanDefinition

BeanDefinitionBuilder构造器

genericBeanDefinition方法

创建一个BeanDefinitionBuilder用来构造一个GenericBeanDefinition。 beanClass:表示Bean类型,未加载类的时候存放Bean的名字,加载类后存放Bean的class信息。

/**
 * Create a new {@code BeanDefinitionBuilder} used to construct a {@link GenericBeanDefinition}.
 * @param beanClass the {@code Class} of the bean that the definition is being created for
 */
public static BeanDefinitionBuilder genericBeanDefinition(Class<?> beanClass) {
   BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition());
   builder.beanDefinition.setBeanClass(beanClass);
   return builder;
}

rootBeanDefinition方法

childBeanDefinition方法

GenericBeanDefinition类

注册BeanDefinition

/** Map of bean definition objects, keyed by bean name. */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

/** List of bean definition names, in registration order. */
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);

Spring启动时在AbstractApplicationContext#refresh()方法的第当Bean注册完成后,会在spring容器中把扫描到的beanDefinition存放到beanDefinitionMap中,方便后续的使用。

读取BeanDefinition

AnnotatedBeanDefinitionReader

解析类上的注解,包含某些注解的时候会成为Bean。

XmlBeanDefinitionReader

解析xml文件中的标签。

ClassPathBeanDefinitionScanner

扫描包路径的读取器。