Bean生命周期

1.Bean生命周期

在Spring框架中,Bean的生命周期由Spring容器管理,包括以下几个阶段:

  1. 实例化:在Spring容器中配置Bean后,容器会使用Java的反射机制实例化Bean对象。这可以通过构造函数创建一个新的Bean实例。
  2. 设置属性值:实例化后,Spring容器会根据配置文件或注解将属性值注入到Bean中。这可以通过setter方法或字段注入来完成。
  3. Bean的后置处理器:在Bean实例化和属性注入完成后,Spring容器会检查是否有配置了Bean的后置处理器(BeanPostProcessor)。如果有,容器将调用相应的方法来进行额外的处理,例如自定义初始化逻辑、数据校验等。
  4. 初始化方法:在Bean的所有属性设置完成后,Spring容器会调用初始化方法,这可以是通过配置文件中的init-method属性指定的自定义方法,也可以是实现了InitializingBean接口的方法。
  5. 使用Bean:在初始化完成后,Bean可以被其他组件或服务使用。
  6. 销毁方法:当Bean不再需要时,可以通过配置文件中的destroy-method属性指定的自定义方法或实现了DisposableBean接口的方法来进行资源的释放和清理。

需要注意的是,Bean的生命周期可以受到作用域的影响。例如,单例作用域的Bean在容器启动时就会创建并初始化,而原型作用域的Bean在每次请求时都会创建一个新的实例。

通过Spring容器管理Bean的生命周期,可以在不同阶段执行自定义的逻辑,例如在初始化方法中执行一些必要的配置或数据加载,或在销毁方法中释放资源。

2.Bean生命周期示例(XML方式):

具体的生命周期过程:

  • bean对象创建(调用无参构造器)
  • 给bean对象设置属性
  • bean的后置处理器(初始化之前)
  • bean对象初始化(需在配置bean时指定初始化方法)
  • bean的后置处理器(初始化之后)
  • bean对象就绪可以使用
  • bean对象销毁(需在配置bean时指定销毁方法)
  • IOC容器关闭

创建User类:(包含:id和username两个属性、set&get方法、无参&有参构造方法、初始&销毁方法)

注意其中的initMethod()和destroyMethod(),可以通过配置bean指定为初始化和销毁的方法

public class User {

    private Integer id;

    private String username;

    public User() {
        System.out.println("生命周期:1、创建对象(调用无参构造)");
    }
    public void setId(Integer id) {
        System.out.println("生命周期:2、依赖注入(给bean设置属性)");
        this.id = id;
    }

    public void initMethod(){
        System.out.println("生命周期:3、初始化");
    }

    public void destroyMethod(){
        System.out.println("生命周期:5、销毁");
    }

    public User(Integer id, String username) {
        this.id = id;
        this.username = username;
    }
    
    public Integer getId() {
        return id;
    }
    
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                '}';
    }
}

创建spring-lifecycle.xml配置Bean:

<!-- bean的后置处理器要放入IOC容器才能生效 -->
<bean id="myBeanProcessor" class="com.xxx.MyBeanProcessor"/>

<!-- 使用init-method属性指定初始化方法 -->
<!-- 使用destroy-method属性指定销毁方法 -->
<bean class="com.xxx.User" init-method="initMethod" 
destroy-method="destroyMethod">
    <property name="id" value="1001"></property>
    <property name="username" value="admin"></property>
</bean>

配置Bean后置处理器:

bean的后置处理器会在生命周期的初始化前后添加额外的操作,需要实现BeanPostProcessor接口,且配置到IOC容器中,需要注意的是,bean后置处理器不是单独针对某一个bean生效,而是针对IOC容器中所有bean都会执行

public class MyBeanProcessor implements BeanPostProcessor {
    
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("后置处理器:初始化前" + beanName + " = " + bean);
        return bean;
    }
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("后置处理器:初始化后" + beanName + " = " + bean);
        return bean;
    }
}

测试:

@Test
public void testBeanLife(){
    ClassPathXmlApplicationContext ac = 
    new ClassPathXmlApplicationContext("spring-lifecycle.xml");
    User bean = ac.getBean(User.class);
    System.out.println("生命周期:4、通过IOC容器获取bean并使用");
    ac.close();
}

结果:
在这里插入图片描述

总之,Spring容器负责管理Bean的整个生命周期,包括实例化、属性注入、初始化、使用和销毁。开发人员可以通过配置文件或注解来定义Bean的生命周期行为,并根据需要执行自定义的初始化和销毁逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值