其实生命周期的本质是:在哪个时间节点上调用了哪个类当中的哪个方法。1.2 Bean 的生命周期 "五步"
我们需要充分的了解在这个生命线当中,都有哪些特殊的时间节点。
只有我们知道了特殊的时间节点都在哪里了,如许我们才可以确定代码的对应上需要该写到哪里。
有时,我们可能需要在某个特殊的时间点上执行一段特定的代码,从而满足我们的需求,而这段代码可以放到哪个节点上,当生命线走到这里的时候,天然会被调用。
留意点:
- 第一步:实例化 Bean
- 第二步:对 Bean 当中的属性进行赋值
- 第三步:初始化 Bean
- 第四步:使用 Bean
- 第五步:销毁 Bean
实践测试:
- 此中的:第三步:初始化 Bean 需要我们通过在 spring.xml 配置文件当中的 标签当中通过 init-method= 属性指定初始化方法 是哪一个方法
- 此中的:第四步:销毁 Bean 也是需要我们通过在 spring.xml 配置文件当中的 标签当中的 destroy-method=性指定销毁方法 是哪个方法
上面我们说到,留意点是:
- 此中的:第三步:初始化 Bean 需要我们通过在 spring.xml 配置文件当中的 标签当中通过 init-method= 属性指定初始化方法 是哪一个方法
- 此中的:第四步:销毁 Bean 也是需要我们通过在 spring.xml 配置文件当中的 标签当中的 destroy-method=性指定销毁方法 是哪个方法
我们需要手动调用 ClassPathXmlApplicationContext类下面的 close() 方法,正常关闭spring容器才会执行销毁方法。
1.3 Bean 的生命周期 “七步”
- 第一:配置文件中的init-method指定初始化方法。destroy-method指定销毁方法
- 第二:只有正常关闭spring容器,bean的销毁方法才会被调用。
- 第三:ClassPathXmlApplicationContext类才有close()方法。
第一步:关于 Bean 的后处置惩罚器的编写:
- 第一步:实例化 Bean
- 第二步:对 Bean 当中的属性进行赋值
- 第三步:执行 Bean 后处置惩罚器的 befor() 方法执行,详细的是:postProcessBeforeInitialization(Object bean, String beanName) 方法
- 第四步:初始化 Bean
- 第五步:执行 Bean 后处置惩罚器的 after() 方法执行,详细的是 postProcessAfterInitialization(Object bean, String beanName) 方法
- 第六步:使用 Bean
- 第七步:销毁 Bean
编写 bean 后处置惩罚器,就是让一个类实现 implements BeanPostProcessor 接口类,同时而且重写此中的before(postProcessBeforeInitialization())和after(postProcessAfterInitialization())方法:
BeanPostProcessor 接口有,两个默认的方法,这两个方法,便是我们需要重写的,来实现我们自己的要的功能。此中两个参数的作用含义分别是:复制代码
- @Nullable
- // 在 Bean 初始化之前被调用
- default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- return bean;
- }
- @Nullable
- // 在 Bean 初始化之后就被调用
- default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
- return bean;
- }
这里我们定义一个MyBeanPostProcessor 类作为 Bean 后处置惩罚器 实现该 implements BeanPostProcessor 接口,并重写此中的两个默认方法。
- Object bean 是该对应的 bean 的对象
- String beanName 是该对应 bean 的在spring.xml配置文件当中 id的名字。
大家需要留意的是:该配置Bean后处置惩罚器。这个后处置惩罚器将作用于当前整个配置文件中全部的bean。第三步:模仿客户端,执行步伐:
也就是作用于当前这个名为 "spring6.xml" 文件当中的,所配置的全部 bean 都会自动使用上这个我们配置的 bean 后处置惩罚器。关于这一点详细说明。我们背面会详细说明的,大家放心。
从运行效果上看,我们可以明显的看出。这个Bean 后处置惩罚器是,作用于此 spring.xml 当中对应的整个 Bean 对象的 。简单的来说:就是只要你在某个此中的 spring.xml配置文件当中,启动了,并配置了对应的 Bean后处置惩罚器,那么整个 spring.xml 配置文件当中的全部的 Bean 对象都会自动启动上该 Bean 后处置惩罚器。1.4 Bean 的生命周期 “十步”
十步是在下面这些位置,增加了另外的三步详细十步如下:
- 首先在 Bean 后处置惩罚器的 befor ()执行的前后各自增加了一步,总共为两步
- Bean 后处置惩罚器的 befor()执行前,增加了 检查 Bean 是否实现了 Aware 的相关接口,并设置相关依靠。
- Bean 后处置惩罚器的 befor()执行后,增加了检查 Bean 是否实现了 InitializingBean 接口,并调用接口当中的方法 。
- 最后一步,添加在了 销毁 Bean 之前,增加了检查 Bean 是否实现了 DisposableBean 接口,并调用接口当中的方法。
增补说明:
- 第一步:实例化 Bean
- 第二步:对 Bean 当中的属性进行赋值
- 第三步: 检查 Bean 是否实现了 Aware 的相关接口,并设置相关依靠。
- 此中Aware 的相关接口有三个分别是:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
- 第四步:执行 Bean 后处置惩罚器的 befor() 方法执行,详细的是:postProcessBeforeInitialization(Object bean, String beanName) 方法
- 第五步:检查 Bean 是否实现了 InitializingBean 接口,并调用接口当中的方法 。
- 第六步:初始化 Bean
- 第七步:执行 Bean 后处置惩罚器的 after() 方法执行,详细的是 postProcessAfterInitialization(Object bean, String beanName) 方法
- 第八步:使用 Bean
- 第九步:检查 Bean 是否实现了 DisposableBean 接口,并调用接口当中的方法。
- 第十步:销毁 Bean
Aware相关的接口包罗:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
- 当Bean实现了BeanNameAware,对应的方法是setBeanName(String name) :Spring会将Bean的名字通报给Bean。
- 当Bean实现了BeanClassLoaderAware,对应的方法是setBeanClassLoader(ClassLoader classLoader) ; Spring会将加载该Bean的类加载器通报给Bean。
- 当Bean实现了BeanFactoryAware,对应的方法是setBeanFactory(BeanFactory beanFactory); Spring会将Bean工厂对象通报给Bean。
InitializingBean 接口下对应的是:afterPropertiesSet () 方法。
DisposableBean 接口下的对应的是:destroy() 方法。
第一步:定义 Bean 类,我们还是使用这个 User 空白类,进行测试。
- 测试以上10步,需要让User类实现5个接口,并实现此中的全部方法:
- BeanNameAware
- BeanClassLoaderAware
- BeanFactoryAware
- InitializingBean
- DisposableBean
如下:我们把上述的User类的“Bean 的生命周期“十步”演示法当中的 ”spring.xml文件中的配置scope设置为prototype。其他任何内容保持稳固。进行演示
- 对于 singleton (spring 默认的单例)作用域的 Bean ,Spring 可以或许精确地知道该 Bean 何时被创建,何时初始化完成的,以及何时被销毁的,符合上述的生命周期的“五步”,“七步”,“十步” 的流程。
- 而对于 prototype(多例) 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给了客户端代码管理,Spring 容器将不再跟踪其生命周期。不符合上述的生命周期的“五步”,“七步”,“十步” 的流程。
从运行效果上看:与之前的 bean 生命周期十步相比较看:我们可以明显的发现。Spring 仅仅到bean 创建后,就不再管理了。而是交给客户端进行自行管理了。spring 不再管理背面的操作了。2.1 自己new的对象让Spring管理
我们需要通过 DefaultListableBeanFactory 这个对象,将我们 new 的对象交给 Spring 管理核心代码:
再通过: DefaultListableBeanFactory 这个对象下的registerSingleton()方法,(这个交给 Spring 管理的bean的id/name 的命名,对于要交给spring管理的对象)
defaultListableBeanFactory.registerSingleton("vipBean",vip);
我们是自己new 的对象,半路上交给 Spring 框架进行管理的,所以我们不需要配置spring.xml 的文件上配置相关的 bean 信息。运行效果:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上汲取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |