07-Spring5 bean的生命周期

1.Bean的生命周期

     Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁。而对于 prototype 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。每次客户端请求prototype 作用域的 Bean 时,Spring 容器都会创建一个新的实例,并且不会管那些被配置成 prototype 作用域的 Bean 的生命周期。

    了解 Spring 生命周期的意义就在于,可以利用 Bean 在其存活期间的指定时刻完成一些相关操作。这种时刻可能有很多,但一般情况下,会在 Bean 被初始化后和被销毁前执行一些相关操作。

    在 Spring 中,Bean 的生命周期是一个很复杂的执行过程,我们可以利用 Spring 提供的方法定制 Bean 的创建过程。当一个 Bean 被加载到 Spring 容器时,它就具有了生命,而 Spring 容器在保证一个 Bean 能够使用之前,会进行很多工作。

    Spring 容器中 Bean 的生命周期流程如下图所示。

  • 1.生命周期图

在这里插入图片描述

  • 2.步骤描述

1.调用User的构造方法,实例化bean;

2.调用User的set方法,设置属性值;

3.如果 Bean 实现了 BeanNameAware 接口,则 Spring将调用该接口setBeanName方法, 将xml配置文件中bean的id设置为beanName;

4.如果 Bean 实现了BeanFactoryAware 接口,则 Spring将调用该接口的setBeanFactory方法传入当前工厂实例的引用;

5.如果 Bean 实现了 ApplicationContextAware 接口,则 Spring将调用该接口的setApplicationContext方法传入当前 ApplicationContext 实例的引用;

6.如果 BeanPostProcessor 和 Bean 关联,则 Spring将调用该接口的预初始化方法 postProcessBeforeInitialization对 Bean 进行加工操作, Spring 的 AOP 就是利用它实现的(此处非常重要);

7.如果 Bean 实现了 InitializingBean 接口,则 Spring将调用该接口的afterPropertiesSet方法;

8.如果bean在xml文件中配置了init-method对应的方法, 则 Spring将调用init-method配置的初始化方法;

9.如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的初始化方法postProcessAfterInitialization, 此时Bean 已经可以被系统使用了;

10.如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果bean在xml文件中配置了destory-method对应的方法,则 Spring 将调用该方法对 Bean 进行销毁。

注意:
如果在 中指定了该 Bean 的作用范围为 scope=“singleton”,则将该 Bean 放入 Spring IoC 的缓存池中,将触发 Spring 对该 Bean 的生命周期管理;如果在 中指定了该 Bean 的作用范围为 scope=“prototype”,则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。

2.实例测试

在这里插入图片描述
User类

package com.limi.test;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

//为了直观的观察生命周期, 继承BeanNameAware, BeanFactoryAware,ApplicationContextAware 重写下面几个方法来进行测试
public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {

    private String name;

    public User(){
        System.out.println("1.调用User的构造方法,实例化bean");
    }

    public void setName(String name) {
        this.name = name;
        System.out.println("2.调用User的set方法,设置属性值");
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("3.调用BeanNameAware的setBeanName方法, BeanName="+s);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("4.调用BeanFactoryAware的setBeanFactory方法");
    }


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("5.调用ApplicationContextAware的setApplicationContext方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("7.调用InitializingBean的afterPropertiesSet方法");
    }

    //自定义的初始化方法
    public void myInitMethod(){
        System.out.println("8.调用init-method配置的初始化方法");
    }

    //自定义的销毁方法
    public void myDestoryMethod(){
        System.out.println("10.调用destory-method配置的销毁方法");
    }



}

MyBeanPostProcessor类

package com.limi.test;

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


//为了直观的观察生命周期, 继承BeanPostProcessor,重写下面两个方法来进行测试
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("6.调用BeanPostProcessor的预初始化方法postProcessBeforeInitialization");
        return null;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("9.调用BeanPostProcessor的初始化方法postProcessAfterInitialization");
        return null;
    }
}

bean1.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--id是唯一标识, class是全类名    -->
    <!--init-method="myInitMethod" destroy-method="myDestoryMethod"是配置自定义的初始化方法和销毁方法-->
    <bean id="User" class="com.limi.test.User" init-method="myInitMethod" destroy-method="myDestoryMethod">
        <property name="name" value="andy"></property>
    </bean>

    <!--把myBeanPostProcessor加入容器-->
    <bean id="myBeanPostProcessor" class="com.limi.test.MyBeanPostProcessor"></bean>
</beans>

测试类MyTest

package com.limi.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {

    @Test
    public void test1(){
        //1.加载bean的xml文件, 以src为根目录
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");

        //2.获取配置的对象, 参数1:bean的id值, 参数2: 类名.class
        User user1 = context.getBean("User", User.class);


        //3.使用对象
        System.out.println("user1:"+user1);

        //手动让bean实例销毁
        ((ClassPathXmlApplicationContext)(context)).close();
    }
}

测试结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于SpringBean生命周期Spring在容器中有5个生命周期阶段,它们分别是:实例化、属性设置、初始化、销毁以及单例实例化,每个阶段的bean都会触发一个对应的回调事件,让开发者能够在每个阶段做一些额外的处理。 ### 回答2: SpringBean 生命周期包括以下几个阶段: 1. Bean 实例化:Spring 在启动时会通过反射机制实例化 Bean。这是 Bean 生命周期的开始阶段。 2. Bean 属性设置:Spring 在实例化 Bean 后,会根据配置文件或注解等方式,将属性值注入到 Bean 中。 3. Bean 初始化前置处理:如果 Bean 实现了 InitializingBean 接口,那么 Spring 会在属性设置完成后调用 Bean 的 afterPropertiesSet() 方法进行初始化前的处理。 4. Bean 初始化后置处理:如果 Bean 配置了 init-method 方法,或者在配置文件中通过 init-method 属性指定了初始化方法,那么 Spring 会在初始化前置处理完成后调用该方法。 5. Bean 使用阶段:在初始化完成后,Bean 就可以被应用程序使用了。 6. Bean 销毁前置处理:如果 Bean 实现了 DisposableBean 接口,那么在关闭应用程序或手动销毁 Bean 时,Spring 会先调用 Bean 的 destroy() 方法进行销毁前的处理。 7. Bean 销毁后置处理:如果 Bean 配置了 destroy-method 方法,或者在配置文件中通过 destroy-method 属性指定了销毁方法,那么 Spring 会在销毁前置处理完成后调用该方法。 在整个 Bean 生命周期中,开发人员可以通过实现 InitializingBean 和 DisposableBean 接口,或者在配置文件中指定 init-method 和 destroy-method 方法,来自定义 Bean 的初始化和销毁过程,并在这些过程中进行一些特定的操作。 ### 回答3: SpringBean生命周期可以分为以下阶段: 1. 实例化:Spring通过Bean定义创建Bean的实例。这可以通过构造函数实例化,或者通过工厂方法来实现。 2. 属性赋值:SpringBean的属性值注入到Bean的实例。这可以通过依赖注入(DI)方式进行,也可以通过配置文件或注解来实现。 3. 初始化:在Bean实例化和属性赋值之后,Spring会调用Bean的初始化方法。这可以通过实现InitializingBean接口的afterPropertiesSet()方法,或者使用@PostConstruct注解来实现。 4. 使用:在初始化完成之后,Bean可以被使用,执行业务逻辑。 5. 销毁:当Bean不再需要时,Spring会调用Bean的销毁方法。这可以通过实现DisposableBean接口的destroy()方法,或者使用@PreDestroy注解来实现。 需要注意的是,在Bean的生命周期中,可以通过配置文件或注解来控制Bean的创建和销毁方式。 总的来说,SpringBean生命周期包括实例化、属性赋值、初始化、使用和销毁这几个阶段。通过控制Bean的生命周期,我们可以在合适的时机执行一些特定的操作,如初始化资源、释放资源等。这样可以有效地管理Bean的生命周期,提高系统的性能和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值