当我们在使用Java Spring框架的时候,经常会听到Bean这个词。Bean是Java Spring框架中的一个基础概念,每一个Bean实际上就是一个Java对象。在Spring中,Bean有不同的生命周期和作用域,这些都是我们必须了解的。
1. Bean的生命周期
Bean的生命周期主要分为三个部分:实例化、初始化和销毁。
1.1 实例化
在Spring中,Bean的实例化是通过Bean工厂完成的。在Bean实例化之前,首先需要读取Spring配置文件中定义的Bean信息,然后通过反射机制实例化Bean对象。
1.2 初始化
Bean对象实例化之后,需要进行初始化。在Spring中,Bean的初始化可以通过两种方式完成。一种是使用配置文件中的init方法,另一种是使用BeanPostProcessor接口。
1.使用init方法初始化
我们可以在配置文件中为Bean配置一个init-method属性,该属性值指定一个方法名,Spring容器会在Bean实例化之后立即调用该方法,完成Bean的初始化过程。
示例代码:
<bean id="person" class="com.example.Person" init-method="init">
</bean>
public class Person {
public void init() {
// 进行初始化操作
}
}
2.使用BeanPostProcessor接口初始化
在Spring中,BeanPostProcessor接口提供了两个方法,分别是postProcessBeforeInitialization和postProcessAfterInitialization。这两个方法可以在Bean的初始化过程中对Bean对象进行处理,比如可以修改Bean对象的属性值等。
示例代码:
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 在Bean初始化之前对Bean对象进行处理
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 在Bean初始化之后对Bean对象进行处理
return bean;
}
}
在配置文件中,我们需要将该类配置为BeanPostProcessor类型的Bean,Spring容器会自动将该类的对象注册为BeanPostProcessor。
<bean id="myBeanPostProcessor" class="com.example.MyBeanPostProcessor"></bean>
1.3 销毁
当Bean对象不再被使用时,需要对其进行销毁。在Spring中,Bean的销毁可以通过两种方式完成。一种是使用配置文件中的destroy方法,另一种是使用DisposableBean接口和preDestroy方法。
1.使用destroy方法销毁
我们可以在配置文件中为Bean配置一个destroy-method属性,该属性值指定一个方法名,Spring容器会在Bean被销毁之前调用该方法,完成Bean的销毁过程。
示例代码:
<bean id="person" class="com.example.Person" destroy-method="destroy">
</bean>
public class Person {
public void destroy() {
// 进行销毁操作
}
}
2.使用DisposableBean接口和preDestroy方法销毁
DisposableBean接口中只有一个destroy方法,当Bean对象被销毁时,Spring容器会调用该方法。preDestroy是JSR-250规范中定义的一种、更为常用的销毁方法。
示例代码:
public class Person implements DisposableBean {
public void destroy() throws Exception {
// 进行销毁操作
}
@PreDestroy
public void preDestroy() throws Exception {
// 进行销毁操作
}
}
2. Bean的作用域
Bean的作用域决定了在Spring容器中每个Bean实例的数量。Spring容器支持以下五种作用域:
2.1 singleton
singleton是Spring容器的默认作用域。在整个容器中,只会创建该Bean的一个实例。当容器初始化的时候,会创建Bean的单个实例,并将该实例作为Spring容器的单个Bean对象存在容器中。
示例代码:
<bean id="person" class="com.example.Person" scope="singleton"></bean>
2.2 prototype
prototype作用域表示在每次获取Bean的时候,都会创建一个新的实例。Spring容器不会保留任何Bean的历史状态,每次调用getBean方法都会返回新的对象实例。
示例代码:
<bean id="person" class="com.example.Person" scope="prototype"></bean>
2.3 request
request作用域表示在每个HTTP请求中,都会创建一个新的实例。在同一个HTTP请求内,多次调用getBean方法都会返回同一个对象实例。但是,在不同的HTTP请求中,会创建新的对象实例。
示例代码:
<bean id="person" class="com.example.Person" scope="request"></bean>
2.4 session
session作用域表示在每个HTTP会话中,都会创建一个新的实例。在同一个HTTP会话内,多次调用getBean方法都会返回同一个对象实例。但是,在不同的HTTP会话中,会创建新的对象实例。
示例代码:
<bean id="person" class="com.example.Person" scope="session"></bean>
2.5 globalSession
globalSession作用域和session作用域非常相似,不过是在Portlet环境下使用的。在Portlet环境中,可以将多个HTTP会话归为一个全局会话,所有属于同一个全局会话的HTTP请求都会共享同一个Bean实例。
示例代码:
<bean id="person" class="com.example.Person" scope="globalSession"></bean>
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Spring中Bean的作用域及生命周期 - Python技术站