前言:Spring BeanDefinition学习
简介
BeanDefinition是一个顶端接口,用于保存Bean的相关信息,类图如下:
基于该接口,衍生出AbstractBeanDefinition、GenericBeanDefinition、RootBeanDefinition等
- AbstractBeanDefinition:抽象类
- AnnotatedGenericBeanDefinition:存储@Configuration注解注释的类
- ChildBeanDefinition:存储子类bean,不可以单独存在,必须要依赖一个父BeanDetintion- ConfigurationClassBeanDefinition:以@Bean注解标记的Bean会被解析为ConfigurationClassBeanDefinition
- GenericBeanDefinition:除了指定类、可选的构造函数参数值和属性参数外,还可以通过parenetName属性灵活设置父类的类全限定名
- RootBeanDefinition:最常用的一个BeanDefinition,也可以作为其他BeanDefinition的父类。但是他不能作为其他BeanDefinition的子类
- ScannedGenericBeanDefinition:存储@Component、@Service、@Controller等注解注释的类
AttributeAccessor
BeanDefinition继承的两个之一,声明了一系列关于属性的方法
1 2 3 4 5 6 7 8 9 10 11 12 13
| public interface AttributeAccessor { void setAttribute(String name, Object value); Object getAttribute(String name); Object removeAttribute(String name); boolean hasAttribute(String name); String[] attributeNames(); }
|
BeanDefinition继承的两个接口之一
1 2 3 4 5 6
| public interface BeanMetadataElement { Object getSource();
}
|
BeanDefinition源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| 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(String parentName); String getParentName(); void setBeanClassName(String beanClassName); String getBeanClassName(); void setScope(String scope); String getScope(); void setLazyInit(boolean lazyInit); boolean isLazyInit(); void setDependsOn(String... dependsOn); String[] getDependsOn(); void setAutowireCandidate(boolean autowireCandidate); boolean isAutowireCandidate(); void setPrimary(boolean primary); boolean isPrimary(); void setFactoryBeanName(String factoryBeanName); String getFactoryBeanName(); void setFactoryMethodName(String factoryMethodName); String getFactoryMethodName(); ConstructorArgumentValues getConstructorArgumentValues(); MutablePropertyValues getPropertyValues(); boolean isSingleton(); boolean isPrototype(); boolean isAbstract(); int getRole(); String getDescription();
String getResourceDescription();
BeanDefinition getOriginatingBeanDefinition();
}
|
总结,beanDefinition定义了定义了bean实例的基础方法,基本上通过BeanDefinition接口基本包含了操作一个bean的方法
有个问题,为什么不用Object储存bean对象,既然两者都可以存储bean对象,为啥是用BeanDefinition而不是Object呢?其实通过上面源码,除了存储bean对象,bean单例或原型、是否延迟加载bean对象、角色、别名、作用域,简单的通过Object对象是无法实现的,必须在此基础上有一个封装,这样才可以实现更多的自定义性质。
另外,在DefaultListableBeanFactory中,spring通过BeanDefinition把每个bean的信息,注册到容器的beanDefinitionMap中,后续对bean的操作就是从这个map取信息的。
最后BeanDefinition只是一个接口,定义了一系列的操作,描述Bean方法的相关属性交给了子类AbstractBeanDefinition,这个抽象类实现了BeanDefinition定义的一系列操作,RootBeanDefinition继承类AbstractBeanDefinition抽象类,在其基础上实现了更多功能