• 近期将进行后台系统升级,如有访问不畅,请稍后再试!
  • 极客文库-知识库上线!
  • 极客文库小编@勤劳的小蚂蚁,为您推荐每日资讯,欢迎关注!
  • 每日更新优质编程文章!
  • 更多功能模块开发中。。。

Spring Bean管理(XML方式)之Bean的生命周期的完整过程

文章目录[隐藏]

Bean 的生命周期

Spring初始化 Bean 或者销毁 Bean 时,有时候需要做一些处理工作,因此Spring可以在创建和拆卸 Bean 的时候调用 Bean 的两个生命周期方法。

这两个方法可以随便取名字,然后在我们配置的时候将其配置上就行了。可以用 init-method 属性来指定 Bean 被初始化的时候会调用的一个方法的名称,这里的 init 是可以任意指定的。

然后在销毁的时候会调用一个方法名”destroy”,destroy 方法调用是有条件的,单例模式的时候才能调用销毁方法,因为多例的时候Spring不知道销毁哪一个。

Web 容器中会自动调用,但是 main 函数或测试用例需要手动调用。

Bean 的生命周期的完整过程

如图是 Bean 生命周期的完整过程

演示过程:

1、instantiate bean 对象实例化

2、populate properties 封装属性

3、如果 Bean 实现 BeanNameAware 执行 setBeanName

4、如果 Bean 实现 BeanFactoryAware 或者 ApplicationContextAware 设置工程 setBeanFactory 或者上下文对象 setApplicationContext

5、如果存在类实现 BeanPostProcessor(后处理 Bean),执行 postProcessBeforeInitialization

6、如果 Bean 实现 InitializingBean 执行 afterPropertiesSet

7、调用指定初始化方法 init

8、如果存在类实现 BeanPostProcessor(处理 Bean),执行 postProcessAfterInitialization

9、执行业务处理

10、如果 Bean 实现 DisposableBean 执行 destroy

11、调用指定销毁方法 customerDestroy

代码演示

根据以上分析,完成代码

demo3 下新建一个 Man.java

package com.jikewenku.ioc.demo3;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class Man implements BeanNameAware,ApplicationContextAware,InitializingBean,DisposableBean{
    private String name;

    public void setName(String name) {
        System.out.println("第二步:设置属性");
        this.name = name;
    }

    public Man(){
        System.out.println("第一步:初始化...");
    }
    public void setup(){
        System.out.println("第七步:MAN 被初始化了...");
    }

    public void teardown(){
        System.out.println("第十一步:MAN 被销毁了...");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("第三步:设置 Bean 的名称"+name);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("第四步:了解工厂信息");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("第六步:属性设置后");
    }

    public void run(){
        System.out.println("第九步:执行业务方法");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("第十步:执行<a href="https://www.jikewenku.com/tag/spring" title="查看更多关于 Spring 的文章" target="_blank">Spring</a>的销毁方法");
    }
}

同时编写配置文件

<bean id="man" class="Man" init-method="setup" destroy-method="teardown">
    <property name="name" value="张三"/>
</bean>

新建一个类 MyBeanPostProcessor

package com.jikewenku.ioc.demo3;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        //System.out.println("第五步:初始化前方法...");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
       · System.out.println("第八步:初始化后方法...");
         return bean;
}

再去配置文件中配置一个 bean 标签,但是这个标签比较特殊,不需要配置 id,因为配置 id 是为了在工厂当中或者其他地方能用到这个 bean,而这个类,在Spring帮我们生成实例的过程中会自动调用,不需要其他地方去引用,所以不需要配置 id.

<bean class="MyBeanPostProcessor"/>

SpringDemo3 中创建测试方法

@Test
public void demo2(){
    ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    Man man = (Man)applicationContext.getBean("man");

    man.run();

    applicationContext.close();
}

运行程序,看一下完整的生命周期,关键部分是其中的第五步和第八步。


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Spring Bean 管理(XML 方式)之 Bean 的生命周期的完整过程
喜欢 (0)
[247507792@qq.com]
分享 (0)
Geekerstar
关于作者:
本站技术支持

欢迎 注册账号 登录 发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00