天天看点

springbean生命周期从陌生到使用

作者:顽强苹果P

在Spring框架中,Bean是一种被Spring IoC容器管理的对象。当一个Bean被创建并添加到IoC容器中时,它会经历一系列的生命周期过程。

1. 实例化:即创建一个Bean的实例,并且这个实例还没有被赋值属性。

2. 属性赋值:在Bean实例化之后,Spring IoC容器开始自动地将Bean的属性赋值给它们所需的值,包括引用其他的Bean、字面量、默认值等等。

3. BeanPostProcessor的前置处理:在Bean初始化之前,Spring IoC容器会调用所有已注册的BeanPostProcessor实现类的postProcessBeforeInitialization()方法。

4. 初始化:在Bean初始化之前,Spring IoC容器会自动检查Bean实现了InitializingBean接口或者配置了init-method属性。如果有,则执行实现的方法。

5. BeanPostProcessor的后置处理:在Bean初始化之后,Spring IoC容器会调用所有已注册的BeanPostProcessor实现类的postProcessAfterInitialization()方法。

6. Disposable:当一个Bean不再需要时,Spring IoC容器会负责从IoC容器中移除它并销毁它。在Bean销毁之前,Spring IoC容器会检查Bean实现了DisposableBean接口或者配置了destroy-method属性。如果有,则执行实现的方法。

总而言之,Spring框架提供了丰富的Bean生命周期管理方法,方便开发人员在不同的生命周期阶段对Bean进行定制化的处理和操作。通过熟悉Bean的生命周期过程,开发人员可以更好地掌握Spring框架的使用,并在应用程序中充分发挥它的优势。

下面是一个简单的Spring Bean示例:

```java

import org.springframework.beans.factory.DisposableBean;

import org.springframework.beans.factory.InitializingBean;

public class MyBean implements InitializingBean, DisposableBean {

private String name;

public void setName(String name) {

this.name = name;

}

public String getName() {

return name;

}

@Override

public void afterPropertiesSet() throws Exception {

System.out.println("MyBean在初始化之前执行");

}

@Override

public void destroy() throws Exception {

System.out.println("MyBean在销毁之前执行");

}

}

```

在这个示例中,MyBean类实现了InitializingBean和DisposableBean接口,这意味着它将在Bean初始化和销毁时调用相应的方法。在afterPropertiesSet()方法中,我们可以添加Bean初始化之前需要执行的自定义代码。在destroy()方法中,我们可以添加Bean销毁之前需要执行的自定义代码。

此外,Spring IoC容器还提供了两种配置Bean生命周期的方式:

1. 通过在XML配置文件中设置init-method和destroy-method属性。

```xml

<bean id="myBean" class="com.example.MyBean" init-method="initMethod" destroy-method="destroyMethod">

<property name="name" value="John"/>

</bean>

```

在这个示例中,我们通过init-method和destroy-method属性分别配置了MyBean的初始化和销毁方法。

2. 通过实现BeanPostProcessor接口,在Bean的前后插入自定义的处理逻辑。

```java

import org.springframework.beans.BeansException;

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

public class MyBeanPostProcessor implements BeanPostProcessor {

@Override

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

System.out.println("MyBeanPostProcessor在Bean实例化之前执行");

return bean;

}

@Override

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

System.out.println("MyBeanPostProcessor在Bean初始化之后执行");

return bean;

}

}

```

在这个示例中,我们定义了一个MyBeanPostProcessor类,实现了BeanPostProcessor接口,并重写了postProcessBeforeInitialization和postProcessAfterInitialization方法,在Bean实例化之前和初始化之后分别执行自定义的处理逻辑。

以上就是Spring Bean的生命周期。