一、Bean作用域定义
限定程序中变量的可用范围叫做作用域,或者说在源代码中定义变量的某个区域就叫做作用域。
而Bean的作用域是指Bean在 Spring 整个框架中的某种行为模式,比效 singleton
单例作用域,就表示Bean 在整个Spring 中只有一份,它是全局共享的,那么当其他人修改了这个值之后,另一个人读取到的就是被修改的值。
1.1 Bean的作用域类型
Spring容器在初始化一个Bean的实例时,同时会指定该实例的作用域。Spring有6种作用域,最后四种是基于Spring MVC
生效的:
singleton
:单例作用域(默认)prototype
:原型作用域(多例作用域)request
:请求作用域(Spring MVC)session
:会话作用域(Spring MVC)application
:全局作用域(Spring MVC)websocket
:HTTP WebSocket
作用域(Spring WebSocket)
单例作用域和全局作用域的区别:
singleton
是 Spring Core
的作用域;application
是 Spring Web
中的作用域; singleton
作用于loC
的容器,而application
作用于Servlet
容器。
1.2 Bean执行流程(Spring执行流程)
启动Spring容器->实例化Bean(分配内存空间,从无到有)->Bean注册到 Spring 中(存操作)->将Bean 装配到需要的类中(取操作)。
二、Bean生命周期
所谓的生命周期指的是一个对象从诞生到销毁的整个生命过程,我们把这个过程就叫做一个对象的生命周期。
Bean的生命周期分为以下5大部分:
- 实例化Bean(为Bean分配内存空间)
- 设置属性(Bean 注入和装配)
- Bean初始化
a) 执行各种通知(执行各种 Aware) ;如BeanNameAware
、BeanFactoryAware
、
ApplicationContextAware
的接口方法。
b) 执行初始化的前置方法;
c) 执行构造方法,两种执行方式,一种是执行@PostConstruct
,另一种实质性init-method
;
d) 执行初始化的后置方法; - 使用Bean
- 销毁Bean
销毁容器的各种方法:
a)@PreDestroy
b) 重写DisposableBean
接口方法
c)destroy-method
import org.springframework.beans.factory.BeanNameAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
//@Component
public class BeanLifeComponent implements BeanNameAware {
@PostConstruct
public void postConstruct() {
System.out.println("执行 @PostConstruct");
}
public void init() {
System.out.println("执行 init-method");
}
public void use() {
System.out.println("使用 bean");
}
@PreDestroy
public void preDestroy() {
System.out.println("执行了 @PreDestroy");
}
public void setBeanName(String s) {
System.out.println("执行了 Aware 通知");
}
}
调用类:
public class App3 {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
BeanLifeComponent beanLifeComponent = context.getBean("beanLifeComponent", BeanLifeComponent.class);
beanLifeComponent.use();
context.destroy();
}
}