本文主要是介绍BeanDefinition源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
介绍
BeanDefinition,顾名思义,是一个对象(Bean)在Spring中描述
BeanDefinition 中保存了我们的 Bean 信息,比如这个 Bean 指向的是哪个类、是否是单例的、是否懒加载、这个 Bean 依赖了哪些 Bean 等等。
Spring 通过定义 BeanDefinition 来管理基于Spring的应用中的各种对象以及它们之间的相互依赖关系,BeanDefinition 抽象了我们对Bean的定义,是让容器起作用的主要数据类型。
IOC是容器,BeanDefinition 就像是容器中的装的水
源码
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {// 我们可以看到,默认只提供 singleton 和 prototype 两种,// 很多读者可能知道还有 request, session, globalSession 这几种,// 不过,它们属于基于 web 的扩展。String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;// 比较不重要,直接跳过吧int ROLE_APPLICATION = 0;int ROLE_SUPPORT = 1;int ROLE_INFRASTRUCTURE = 2;// 设置父 Bean,这里涉及到 bean 继承,不是 java 继承。请参见附录的详细介绍// 一句话就是:继承父 Bean 的配置信息而已void setParentName(String parentName);// 获取父 BeanString getParentName();// 设置 Bean 的类名称,将来是要通过反射来生成实例的void setBeanClassName(String beanClassName);// 获取 Bean 的类名称String getBeanClassName();// 设置 bean 的 scopevoid setScope(String scope);String getScope();// 设置是否懒加载void setLazyInit(boolean lazyInit);boolean isLazyInit();// 设置该 Bean 依赖的所有的 Bean,注意,这里的依赖不是指属性依赖(如 @Autowire 标记的),// 是 depends-on="" 属性设置的值。void setDependsOn(String... dependsOn);// 返回该 Bean 的所有依赖String[] getDependsOn();// 设置该 Bean 是否可以注入到其他 Bean 中,只对根据类型注入有效,// 如果根据名称注入,即使这边设置了 false,也是可以的void setAutowireCandidate(boolean autowireCandidate);// 该 Bean 是否可以注入到其他 Bean 中boolean isAutowireCandidate();// 主要的。同一接口的多个实现,如果不指定名字的话,Spring 会优先选择设置 primary 为 true 的 beanvoid setPrimary(boolean primary);// 是否是 primary 的boolean isPrimary();// 如果该 Bean 采用工厂方法生成,指定工厂名称。对工厂不熟悉的读者,请参加附录// 一句话就是:有些实例不是用反射生成的,而是用工厂模式生成的void setFactoryBeanName(String factoryBeanName);// 获取工厂名称String getFactoryBeanName();// 指定工厂类中的 工厂方法名称void setFactoryMethodName(String factoryMethodName);// 获取工厂类中的 工厂方法名称String getFactoryMethodName();// 构造器参数ConstructorArgumentValues getConstructorArgumentValues();// Bean 中的属性值,后面给 bean 注入属性值的时候会说到MutablePropertyValues getPropertyValues();// 是否 singletonboolean isSingleton();// 是否 prototypeboolean isPrototype();// 如果这个 Bean 是被设置为 abstract,那么不能实例化,// 常用于作为 父bean 用于继承,其实也很少用......boolean isAbstract();int getRole();String getDescription();String getResourceDescription();BeanDefinition getOriginatingBeanDefinition();
}
运用
org.springframework.beans.factory.support.DefaultListableBeanFactory中含有一个beanDefinitionMap
/** Map of bean definition objects, keyed by bean name */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);
其中key为bean的name,value为BeanDefinition的子类
参考文档
- Spring IOC 容器源码分析
这篇关于BeanDefinition源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!