一.Bean的作用域
在SpringIoC中类注解(@Component,@Controller,@Servie,@Repository,@Configuration)
方法注解(@Bean)都是用来声明Bean对象
通过@Autowired , 构造方法,Setter方法来获取注入Spring并由Spring管理的Bean对象
通过 ApplicationContext 或者 BeanFactory 来获取对象
默认情况下, Spring容器中的bean是单例的
| 作用域 | 描述 | 特点 | 适用场景 |
|---|---|---|---|
| singleton 单例作用域 | 每个 Spring 容器只创建一个共享实例(默认) | 所有请求返回同一个实例;容器管理生命周期 | 无状态服务类、DAO、控制器 |
| prototype 原型作用域 | 每次请求(注入或 getBean)都创建新实例 |
容器只负责创建和组装依赖,不管理销毁 | 有状态的 Bean、临时 Helper 类 |
| request 请求作用域 | 每个 HTTP 请求创建一个新实例(仅 Web 应用) | 实例在当前请求内有效,请求结束销毁 | 请求上下文数据、表单对象 |
| session 会话作用域 | 每个 HTTP Session 共享一个实例(仅 Web 应用) | 实例在整个用户会话期间有效,会话结束销毁 | 购物车、用户登录信息 |
| application 全局作用域 | 每个 ServletContext 生命周期创建一个实例 |
类似于单例,但作用域是整个 Web 应用上下文 | 跨多个 Servlet/Controller 的全局数据 |
| websocket HTTPWebSocket 作用域 | 每个 WebSocket 会话创建一个实例(仅 Web 应用) | 实例与 WebSocket 会话绑定,长连接期间有效 | WebSocket 会话状态管理 |
可以通过@Scope来设置,
singleton和prototype是给@Scope里面传入ConfigurableBeanFactory然后调用方法
java
String SCOPE_SINGLETON = "singleton";
String SCOPE_PROTOTYPE = "prototype";
request使用@RequestScope, session使用@SessionScope, application使用@ApplicationScope
二.Bean的生命周期

1.实例化
为Bean分配内存空间
2.属性赋值
Bean注入和装配, 如 @AutoWired
3.初始化
@PostConstruct
1.执行各种通知
2.执行初始化的前置方法
3.执行初始化方法
4.执行初始化的后置方法
4.使用Bean
5.销毁Bean
@PreDestroy-Spring 自动调用,@DisposableBean -手动调用