BeanDefinition作为定义springBean文件中bean的接口,可以说是bean的抽象数据结构,它包括属性参数,构造器参数,以及其他具体的参数。
BeanDefinition继承了AttributeAccessor和BeanMetaDataElement接口,拥有了对于元数据访问的功能。
作用域:
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON; 单例 String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE; 非单例
角色 ROLE_APPLICATION 用户 ROLE_SUPPORT 某些复杂的配置 ROLE_INFRASTRUCTURE 完全内部使用
AbstractBeanDefinition是对BeanDefinition的抽象实现类,我们可以看一下它的值域和方法
public static final String INFER_METHOD = "(inferred)"; // Bean所抽象的class private volatile Object beanClass; // 作用域 private String scope = SCOPE_DEFAULT; // 是否抽象 private boolean abstractFlag = false; // 懒加载 private boolean lazyInit = false; private int autowireMode = AUTOWIRE_NO; // 依赖 private int dependencyCheck = DEPENDENCY_CHECK_NONE; private String[] dependsOn; private boolean autowireCandidate = true; private boolean primary = false; private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<String, AutowireCandidateQualifier>(0); private boolean nonPublicAccessAllowed = true; private boolean lenientConstructorResolution = true; // 构造函数参数抽象 private ConstructorArgumentValues constructorArgumentValues; // 值域的抽象 private MutablePropertyValues propertyValues; // 方法重写的抽象 private MethodOverrides methodOverrides = new MethodOverrides(); private String factoryBeanName; private String factoryMethodName; private String initMethodName; private String destroyMethodName; private boolean enforceInitMethod = true; private boolean enforceDestroyMethod = true; private boolean synthetic = false; private int role = BeanDefinition.ROLE_APPLICATION; private String description; private Resource resource;可以看到值域基本上都是用来存储BeanDefinition接口所需要的内容,只是比BeanDefinition多出了initMethodName 和 destroyMethodName。
用来存储定义bean的时候使用的构造函数传入的参数信息
public class ConstructorArgumentValues { // 用来存储带有index的值 private final Map<Integer, ValueHolder> indexedArgumentValues = new LinkedHashMap<Integer, ValueHolder>(0); // 用来存储不带有index的值 private final List<ValueHolder> genericArgumentValues = new LinkedList<ValueHolder>(); } // 用来存储值的信息 public static class ValueHolder implements BeanMetadataElement { // 对应的值 private Object value; // 对应的类型 private String type; // 对应的名称 private String name; private Object source; // 是否已经转换 private boolean converted = false; // 是转换后的值 private Object convertedValue; }(1)RootBeanDefinition、GenericBeanDefinition、ChildBeanDefinition RootBeanDefinition是最常用的实现类,它对应一般性的元素标签,GenericBeanDefinition是自2.5以后新加入的bean文件配置属性定义类,是一站式服务类。在配置文件中可以定义父和子,父用RootBeanDefinition表示,而子用ChildBeanDefiniton表示,而没有父的就使用RootBeanDefinition表示 (2)AnnotatedGenericBeanDefinition 以@Configuration注解标记的会解析为AnnotatedGenericBeanDefinition (3)ConfigurationClassBeanDefinition 以@Bean注解标记的会解析为ConfigurationClassBeanDefinition
(4)ScannedGenericBeanDefinition 以@Component注解标记的会解析为ScannedGenericBeanDefinition
接下来可以了解一下spring如何将xml或者注解类转换为BeanDefinition https://blog.csdn.net/liu20111590/article/details/89892342 https://blog.csdn.net/liu20111590/article/details/89857660