Spring Bean生命周期

本文详细介绍了Spring框架中Bean的生命周期,包括BeanDefinition的处理、BeanFactoryPostProcessor的角色,如属性占位符解析和自定义bean属性修改。此外,还讨论了Aware接口用于从Spring容器获取属性值的功能,以及AOP中的动态代理,通过BeanPostProcessor实现Jdk和Cglib两种方式的代理对象创建。
摘要由CSDN通过智能技术生成

承接上文Spring框架源码分析一

在BeanDefinition和BeanFactory之间还会经过一些beanFactoryPostProcessor方法,该方法的作用是转换BeanDefinition中的属性值,

  • 使用场景1

比如把${db.name}占位符解析成具体的值。

  • 使用场景2

继承BeanFactoryPostProcessor,也可以修改自定义bean的属性信息,比如xml中定义了100个bean User(name,age),想要修改其中一个user bean的age属性值,就可以通过这种方式。

  • 使用场景3

定义component scan package,可以扫描当前目录里面包含的一些注解,把那些类读取到之后,需要做一个相关的解析,该解析的过程就是在beanFactoryPostProcessor中处理的。

按照下面这个过程查看spring源码,就可以看到解析注解的过程,

判断类上有没有@PropertySource注解,有的话,进行相应的解析和处理,进而完成一个具体的解析操作,所以这里可以进行扩展,自己需要的时候,就可以进行一些基础的相关扩展工作,但关键点是你要对它整体的执行流程和执行机制比较清楚并且可以修改源码。

Bean的生命周期

BeanFactory工厂的实现类应该支持标准的bean的生命周期接口,完整的初始化方法和标准顺序是:

第一步通过反射就完成实例化操作;

第二步叫初始化,

填充属性(populateBean方法)

填充bean的属性值,通过属性值填充对应的属性。

接下来执行Aware接口实现的方法,就是为了设置某些具体的属性值,

比如定义一个类实现了Aware接口,可以做一些扩展,

Aware接口存在的意义是方便通过spring中的bean对象获取对应容器中的相关属性值,比如bean名称或当前系统中的环境。

当执行完这些步骤,就已经有了当前对象的bean对象了,有了bean对象之后,能否对当前bean做一个修改操作?

以AOP举例说明这个问题,

AOP面向切面编程 ,根据动态代理生成一个新的代理对象,已经有了这个bean了才能生成代理对象,动态代理有两种实现技术jdk和cglib,是通过BeanPostProcessor实现的,

BeanPostProcessor接口的一个抽象实现类AbstractAutoProxyCreator(抽象的自动代理创建器)重写postProcessAfterInitialization方法,调用wrapIfNecessary,再调用

再调用

通过工厂来获取具体的一个代理对象,

这就是动态代理的2种方式 Jdk和Cglib,所以想实现动态代理的话,需要实现BeanPostProcessor接口,

想实现动态代理需要实现before和after这两个方法,所以生成bean对象之后能够进行扩展,因为生成的bean不代表是最终的bean,还可以对它进行改变。

到这里为止,创建的bean的整个生命周期就结束了。

最后是一个完整的对象了,可以拿过来直接进行一个相关的使用了。

当完整对象使用完之后,要进行一些销毁的操作,一般很少去手动关闭这里就不关注了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值