Spring系列之基础篇-Spring BeanDefinition初探

BeanDefinition,顾名思义,是一个对象(Bean)在Spring中描述,其核心类图:
这里写图片描述
这里写图片描述
从类图我们详细了解BeanDefinition。
BeanDefinition接口继承自BeanMetadataElement和AttributeAccessor两个接口。
BeanMetadataElement:bean元数据,返回该bean的来源。
AttributeAccessor:Spring定义的属性访问器,对Bean的属性进行操作的API,例如设置属性、获取属性、判断是否存在该属性,返回bean所有的属性名称等。
下面重点分析一下BeanDefinition接口。
属性列表:
1)String SCOPE_SINGLETON,bean的作用范围,单例模式
2)String SCOPE_PROTOTYPE,bean的作用范围为prototype,在Spring生命周期中,会存在多个,由垃圾回收期管理其生命周期。
3)int ROLE_APPLICATION:bean的角色定义,默认,为应用程序定义。
4)int ROLE_SUPPORT:bean的角色定义,为应用程序定义的比较大的对象。
5)int ROLE_INFRASTRUCTURE:Spring内部定义的Bean对象。
核心方法详解:
1)void setBeanClassName(String beanClassName) :该Bean的class name。
2)void setScope(String scope):bean的生命周期,单例还是prototype。
3)void setLazyInit(boolean lazyInit):lazyInit,是否延迟加载,如果设置为true,在需要用到时再初始化。
4)void setDependsOn(String… dependsOn):dependsOn一般用于两个bean之间没有显示依赖,但后一个Bean需要用到前一个Bean执行初始方法后的结果。例如在< bean id=“a” dependsOn=“b”/> 时,在初始化a时首先先初始化b,在销毁b之前会先销毁a。
5)void setAutowireCandidate(boolean autowireCandidate)设置该对象是否可以被其他对象自动装配。
spring通过配置bean的autowire属性设置自动装配方式:
no:不使用自动装配,必须通过ref元素指定依赖,为autowire默认值。
byName:使用属性名自动装配,如果存在一个与指定属性名相同类型的bean则自动装配,如果有多个,则抛
出异常。
byType:根据类型自动状态,如果存在与指定属性类型相同的bean,则自动装配,如果有多个,则抛出异常。
constructor:与byType类似,不同之处在于它使用的是构造器的参数类型。
autodetect:通过bean的自省机制来决定是使用constructor还是byType来进行自动装配。如果有默认构造
器,则使用byType,否则使用constructor。
6)void setPrimary(boolean primary),如果其他对象按照类型自动装配时发现有多个符合类型的多个实现bean,如果bean的primary属性为true,则以primary为true的优先,当然如果有多个primary为true,则抛出异常。
7)void setFactoryBeanName(String factoryBeanName):设置bean的factoryBeanName。
8)void setFactoryMethodName(String factoryMethodName):设置bean工厂的方法名,Spring在实例化Bean对象时支持工厂方法设计模式,在初始化bean时不是通过bean的class发射创建 bean实例,而是根据factoryBeanName反射出工厂的实例,然后调用它的实例方法factoryMethodName来创建bean实例。
9)ConstructorArgumentValues getConstructorArgumentValues():获取bean的构造方法参数。
10)MutablePropertyValues getPropertyValues():获取实例bean的所有属性。
11)boolean isSingleton():是否是单例。
12)boolean isPrototype():是否是非单例。
13)boolean isAbstract():是否是抽象的。

本文主要是根据BeanDefinition接口了解bean的一些特性,值得引起注意的是:lazy-init、depends-on、autowire-candidate、autowire、primary、factory-bean、factory-method。
注:本文并没有尝试去罗列spring bean标签的全部属性。


欢迎加笔者微信号(dingwpmz),加群探讨,笔者优质专栏目录:
1、源码分析RocketMQ专栏(40篇+)
2、源码分析Sentinel专栏(12篇+)
3、源码分析Dubbo专栏(28篇+)
4、源码分析Mybatis专栏
5、源码分析Netty专栏(18篇+)
6、源码分析JUC专栏
7、源码分析Elasticjob专栏
8、Elasticsearch专栏(20篇+)
9、源码分析MyCat专栏

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中间件兴趣圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值