Spring基础:Bean的生命周期

Posted Lansonli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring基础:Bean的生命周期相关的知识,希望对你有一定的参考价值。

文章目录

Bean的生命周期

一、Bean从创建到销毁经历的各个阶段以及每个阶段所调用的方法

二、测试生命周期

1、准备bean

2、配置bean

3、测试bean

三、关于后置处理器

1、创建后置处理器 实现 BeanPostProcesser  重写两个方法

2、配置后置处理器,对容器中的所有bean添加后置处理器的生命周期

四、BeanPostProcessor接口作用


Bean的生命周期

一、Bean从创建到销毁经历的各个阶段以及每个阶段所调用的方法

1、通过构造器创建bean实例           执行构造器

2、为bean属性赋值                          执行set方法

3、初始化bean                                 调用bean的初始化方法,需要配置指定调用的方法

4、bean的获取                                 容器对象 getBean方法

5、容器关闭销毁bean                      调用销毁方法,需要配置指定调用的方法

二、测试生命周期

1、准备bean

package com.lanson.bean;
/**
 * @Author: lansonli
 * @Description: MircoMessage:Mark_7001
 */
public class User 
    private Integer userid;
    private String username;
    private String password;
    public void initUser()
        System.out.println("第三步:User初始化");
    
    public User() 
        System.out.println("第一步:User构造");
    
    public void destoryUser()
        System.out.println("第五步:User销毁");
    
    @Override
    public String toString() 
        return "User" +
                "userid=" + userid +
                ", username='" + username + '\\'' +
                ", password='" + password + '\\'' +
                '';
    
    public User(Integer userid, String username, String password) 
        this.userid = userid;
        this.username = username;
        this.password = password;
    
    public void setUserid(Integer userid) 
        System.out.println("setUserid");
        this.userid = userid;
    
    public void setUsername(String username) 
        System.out.println("第二步:User属性赋值");
        this.username = username;
    
    public void setPassword(String password) 
        this.password = password;
    

2、配置bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.lanson.bean.User" init-method="initUser" destroy-method="destoryUser">
        <property name="username" value="lansonli"></property>
    </bean>
</beans>

3、测试bean

package com.lanson.test;
import com.lanson.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @Author: lansonli
 * @Description: MircoMessage:Mark_7001
 */
public class Test1 
    @Test
    public void testGetBean()
        ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = context.getBean("user",User.class);
        System.out.println("第四步:User对象从容器中获取");
        // 关闭容器
        context.close();
    

三、关于后置处理器

  1. 通过构造器创建bean实例           执行构造器
  2. 为bean属性赋值                         执行set方法
  3. 把bean实例传递给bean的后置处理器的方法
  4. 初始化bean                                调用bean的初始化方法,需要配置指定调用的方法
  5. 把bean实例传递给bean的后置处理器的方法
  6. bean的获取                                容器对象 getBean方法
  7. 容器关闭销毁bean                      调用销毁方法,需要配置指定调用的方法

1、创建后置处理器 实现 BeanPostProcesser  重写两个方法

package com.lanson.beanProcesser;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
 * @Author: lansonli
 * @Description: MircoMessage:Mark_7001
 */
public class MyBeanProcesser implements BeanPostProcessor 
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException 
        //Object bean      实例化的bean
        //String beanName  bean的id
        System.out.println("bean:初始化方法之前");
        return bean;// 这里必须return bean
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException 
        System.out.println("bean:初始化方法之后");
        return bean;// 这里必须returnbean
    

2、配置后置处理器,对容器中的所有bean添加后置处理器的生命周期

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.lanson.bean.User" init-method="initUser" destroy-method="destoryUser">
        <property name="username" value="lansonli"></property>
    </bean>
    <bean id="myBeanProcesser" class="com.lanson.beanProcesser.MyBeanProcesser"></bean>
</beans>

四、BeanPostProcessor接口作用

如果我们想在Spring容器中完成bean实例化、配置以及其他初始化方法前后要添加一些自己逻辑处理。我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中。

  • 接口中的两个方法都要将传入的bean返回,而不能返回null,如果返回的是null那么我们通过getBean方法将得不到目标。
  • ApplicationContext会自动检测在配置文件中实现了BeanPostProcessor接口的所有bean,并把它们注册为后置处理器,然后在容器创建bean的适当时候调用它,因此部署一个后置处理器同部署其他的bean并没有什么区别。而使用BeanFactory实现的时候,bean 后置处理器必须通过代码显式地去注册,在IoC容器继承体系中的ConfigurableBeanFactory接口中定义了注册方法


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

以上是关于Spring基础:Bean的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Spring基础14——Bean的生命周期

Spring基础:Bean的生命周期

Spring基础学习—详解Bean(下)

Spring核心技术——Spring中Bean的生命周期

Spring之Bean的生命周期详解

Spring Bean的生命周期