L03_什么是 BeanDefinition

什么是 BeanDefinition?

BeanDefinition 是SpringFreamwork 定义配置元信息的接口。包含:

• Bean 的类名

• Bean 行为配置元素,如作用域、自动绑定的模式,生命周期回调等

• 其他 Bean 引用,又可称依赖

• 配置设置,比如 Bean

在这里插入图片描述

1、BeanDefinition 元信息

属性说明
ClassBean 全类名
NameBean 名称或 ID
ScopeBean 作用域范围
Constructor ArgsBean 构造器参数(用作依赖注入)
PropertiesBean 属性 (用作依赖注入)
Autowiring modeBean 自动绑定模式
Lazy initiallization modeBean 延迟初始化模式
Initialization methodBean 初始化回调方法名称
Destruction methodBean 销毁回调方法名称

2、BeanDefinition 构建

  • 通过 BeanDefinitionBuilder
// 1. 通过BeanDefinitionBuilder 构建
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
beanDefinitionBuilder
		.addPropertyValue("id","1")
   		.addPropertyValue("name","张三");
BeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
  • 通过 AbstractBeanDefinition 以及派生类
// 2. 通过 AbstractBeanDefinition 派生类构建
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues
		.add("id","1")
        .add("name","张三");
genericBeanDefinition.setPropertyValues(propertyValues);

3、BeanDefinition 命名

每个 Bean 拥有一个或多个标识符(identifiers),这些标识符在 Bean 所在的容器必须是唯一的。通常,一个 Bean 仅有一个标识符,如果需要额外的,可考虑使用别名(Alias)来扩充。

Bean 名称生成器(BeanNameGenerator),框架內建两种实现:

DefaultBeanNameGenerator :默认通用 BeanNameGenerator 实现

AnnotationBeanNameGenerator:基于注解扫描的 BeanNameGenerator 实现

4、BeanDefinition 别名

Bean 别名(Alias)的价值

a、复用现有的 BeanDefinition

b、更具有场景化的命名方法,比如:

5、BeanDefinition 注册

a、XML 配置元信息

<bean name="" …/>

b、JAVA 注解配置元信息

@Bean、@Component、@Import

c、JAVA API 配置元信息

命名方式:BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)

非命令方式:
BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition,BeanDefinitionRegistry)

配置方式:

AnnotatedBeanDefinitionReader#register(Class…)

6、注册 Bean

(1)通过 BeanDefinition

(2)通过 外部单体对象(SingletonBeanRegistry#registerSingleton)

7、实例化 Bean

常规方式

(1)通过构造器(配置元信息:XML、Java 注解和 Java API )

(2)通过静态工厂方法(配置元信息:XML 和 Java API )

(3)通过 Bean 工厂方法(配置元信息:XML和 Java API )

(4)通过 FactoryBean(配置元信息:XML、Java 注解和 Java API )

特殊方式

(1)通过 ServiceLoaderFactoryBean

(2)通过 AutowireCapableBeanFactory#createBean(java.lang.Class, int, boolean)

(3)通过 BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)

8、初始化 Bean

a、 @PostConstruct 标注方法

b、实现 InitializingBean 接口的 afterPropertiesSet() 方法

c、自定义初始化方法

  • XML 配置:<bean init-method=”init” … />
  • Java 注解:@Bean(initMethod=”init”)
  • Java API:AbstractBeanDefinition#setInitMethodName(String)

9、延迟初始化 Bean

a、XML 配置

<bean lazy-init=”true” … />

b、Java 注解

@Lazy(true)

10、销毁 Bean

a、@PreDestroy 标注方法

b、实现 DisposableBean 接口的 destroy() 方法

c、自定义销毁方法

  • XML 配置:<bean destroy=”destroy” … />

  • Java 注解:@Bean(destroy=”destroy”)

  • Java API:AbstractBeanDefinition#setDestroyMethodName(String)

11 、垃圾回收 Bean

(1)关闭 Spring 容器(应用上下文)

(2)执行 GC

(3)Spring Bean 覆盖的 finalize() 方法被回调

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值