Spring框架中Bean的作用域和生命周期是开发高效应用的关键要素。本文将详细解析各类作用域特性及生命周期管理要点。
@Scope("singleton")getBean()或注入都会触发实例化@Scope("prototype")注解RequestContextListener支持@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)@Scope(value = WebApplicationContext.SCOPE_GLOBAL_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)@Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)Bean实例化过程包含两种主要方式:

构造器实例化:容器直接调用类构造方法创建实例
public class UserService {
public UserService() {
// 构造器逻辑实现
}
}
工厂方法实例化:通过静态或实例工厂创建对象
public class BeanFactory {
public static UserService createInstance() {
return new UserService();
}
}
依赖注入主要实现方式包括:
Setter注入:通过标准setter方法完成注入
public class OrderService {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
}
字段注入:使用注解直接注入字段
public class OrderService {
@Autowired
private UserService userService;
}
构造器注入:通过构造函数参数注入
public class OrderService {
private final UserService userService;
public OrderService(UserService userService) {
this.userService = userService;
}
}
初始化阶段支持三种回调机制:
InitializingBean接口:
public class ExampleBean implements InitializingBean {
@Override
public void afterPropertiesSet() {
// 初始化业务逻辑
}
}
自定义init-method:
public class ExampleBean {
public void init() {
// 初始化处理
}
}
@PostConstruct注解:
public class ExampleBean {
@PostConstruct
public void initMethod() {
// 初始化操作
}
}
完全初始化的Bean可以:
销毁阶段提供三种清理机制:
DisposableBean接口:
public class ExampleBean implements DisposableBean {
@Override
public void destroy() {
// 资源释放逻辑
}
}
自定义destroy-method:
public class ExampleBean {
public void cleanup() {
// 清理操作
}
}
@PreDestroy注解:
public class ExampleBean {
@PreDestroy
public void clearResources() {
// 释放资源
}
}
@Scope("singleton")
public class SingletonBean {
// 容器全生命周期管理
}
@Scope("prototype")
public class PrototypeBean {
// 需手动资源清理
public void release() {
// 释放逻辑
}
}
Singleton作用域在多线程环境下需要特别注意:
共享变量风险:实例变量可能引发线程竞争
public class CounterService {
private int count; // 存在线程安全隐患
public void add() {
count++;
}
}
Prototype作用域需特别关注资源管理:
@Scope("prototype")
public class ResourceHandler implements DisposableBean {
private Connection conn;
public void execute() throws SQLException {
conn = DriverManager.getConnection(url);
// 业务处理
}
@Override
public void destroy() {
if(conn != null) conn.close();
}
}
作用域选择需综合考量以下因素:
| 作用域 | 适用场景 | 注意事项 |
|---|---|---|
| Singleton | 无状态服务、工具类 | 线程安全评估 |
| Prototype | 有状态对象 | 资源管理 |
| Request | 请求级数据 | 仅限Web环境 |
| Session | 用户会话数据 | 集群环境适配 |
| Application | 全局共享数据 | Web环境专用 |
选择策略:
通过深入理解Bean作用域和生命周期机制,开发者可以构建更高效、稳定的Spring应用,有效避免资源泄漏和并发问题。