Spring Bean 作用域
当在 Spring 中定义一个 bean 时,你必须声明该 bean 的作用域的选项。例如,为了强制 Spring 在每次需要时都产生一个新的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。同理,如果你想让 Spring 在每次需要时都返回同一个bean实例,你应该声明 bean 的作用域的属性为 singleton。
Spring 框架支持以下五个作用域,如果你使用 web-aware ApplicationContext 时,其中三个是可用的。
| 作用域 | 描述 |
|---|---|
| singleton |
在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认值 |
| prototype | 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean() |
| request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
| session | 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境 |
| global-session | 一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境 |
Spring Bean 生命周期
当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当 bean 不再需要,并且从容器中移除时,可能需要做一些清除工作。用带有 init-method 和/或 destroy-method 参数,监控其运行开始和销毁时候的bean。也可以是默认的,默认的初始化和销毁方法在beans 中增加default-init-method="init" default-destroy-method="destroy"。注册一个在 AbstractApplicationContext 类中声明的关闭 hook 的 registerShutdownHook()方法。
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
obj.getMessage();
context.registerShutdownHook();
}
Spring Bean 后置处理器
实现 BeanPostProcessor ,它在任何 bean 的初始化的之前和之后输入该 bean 的名称。你可以在初始化 bean 的之前和之后实现更复杂的逻辑,因为你有两个访问内置 bean 对象的后置处理程序的方法。
实现完成以后,还需要在spring 的xml中配置其实例化。
public class InitHelloWorld implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeforeInitialization : " + beanName);
return bean; // you can return any other object as well
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("AfterInitialization : " + beanName);
return bean; // you can return any other object as well
}
}
本文详细介绍了Spring框架中Bean的五种作用域:singleton、prototype、request、session和global-session,以及Bean的生命周期,包括初始化和销毁过程。此外,还讲解了如何通过init-method和destroy-method进行自定义初始化和清理操作。

261

被折叠的 条评论
为什么被折叠?



