通过前面几节,基本了解了Spring的bean的使用、注入以及配置作用域。那么Spring是怎么实例化Bean的呢?被容器管理的Bean什么时候创建,以及什么时候释放呢?本节讲解Spring的Bean的装配和关闭的过程。
Spring装配Bean的过程如下:
1)实例化Bean。
2)设置属性值。
3)如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name。
4)如果实现了BeanFactoryAware接口,调用setBeanFactory设置BeanFactory。
5)如果实现了ApplicationContextAware接口,调用setApplicationContext设置Application-Context。
6)调用BeanPostProcessor的预先初始化方法。
7)调用InitializingBean的afterPropertiesSet()方法。
8)调用定制init-method方法。
9)调用BeanPostProcessor的后初始化方法。
Spring销毁Bean的过程如下:
1)调用DisposableBean的destroy()。
2)调用定制的destroy-method方法。
下面重点讲解初始化回调函数和销毁回调函数,它们常用于Bean的初始化和销毁时进行业务处理操作。
(1)初始化回调函数,有两种实现方式:
1)通过实现org.springframework.beans.factory.InitializingBean接口。
使用之前的Product类进行演示,将此类复制一份,然后实现InitializingBean接口,具体 如下:
在Spring配置文件中配置bean标签,具体如下:
编写测试代码如下:
运行结果如下:
execute afterPropertiesSet()
execute one
execute two
观察运行结果可以发现,实现InitializingBean接口的类仅仅在初始化的时候调用一次接口方法,由于此bean标签配置的是单例模式,所以之后再次使用getBean方法时接口方法没有被调用。
2)在配置文件中使用init-method属性指定无参数方法
使用之前的Product类进行演示,将此类复制一份,定义一个方法initMethod,当然方法名可以随便定义,具体如下:
之后在XML文件的bean标签中定义init-method属性,属性值为上面定义的initMethod方法的名称。具体如下:(www.xing528.com)
编写测试代码如下:
运行结果如下:
execute initMethod()
execute one
execute two
观察运行结果可以发现initMethod方法仅仅在初始化的时候调用一次,由于此bean标签配置的是单例模式,所以之后再次使用getBean方法时initMethod方法没有被调用。
(2)销毁回调函数,有两种实现方式:
1)实现org.springframework.beans.factory.DisposableBean接口。
使用之前的Product类进行演示,将此类复制一份,然后实现DisposableBean接口,具体如下:
在Spring配置文件中配置bean标签,具体如下:
为了能监听到销毁回调函数,需要在AbstractApplicationContext[7]类中调用关闭hook的registerShutdownHook()方法。它将确保正常关闭Bean,并且调用destroy方法。编写测试代码如下:
运行结果如下:
execute one
execute two
execute destroy()
观察控制台输出内容,当对象被销毁时会调用DisposableBean接口的destroy()方法。
2)在配置文件中使用destroy-method属性来指定无参数方法。
使用之前的Product类进行演示,将此类复制一份,定义一个方法destroyMethod,具体如下:
在XML配置中指定bean标签destroy-method属性对应类中的方法名称:
编写测试代码如下:
public class TestIocCaseLifeCircleWithDestroyMethod{
运行结果如下:
execute one
execute two
execute destroyMethod()
这里注册了registerShutdownHook()方法,在Bean销毁的时候,会执行对应配置的销毁 方法。
通过上面的例子,将方法关联到Bean的生命周期,以便在恰当的生命周期中实现业务逻辑。例如在容器初始化时预加载缓存,或者销毁时进行日志统计等。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。