JSR 250(Java Specification Request 250)是 Java 平台中一项重要的基础规范,全称为:
Common Annotations for the Java Platform
(Java 平台通用注解)
它由 Java Community Process(JCP)制定,首次在 Java EE 5(2006 年)中引入,并从 Java SE 6 开始被纳入标准库 。其核心目标是:为 Java 应用提供一套轻量级、跨框架、标准化的基础注解,用于统一处理生命周期管理、资源注入、安全声明等通用需求。
一、为什么需要 JSR 250?
在早期 Java EE 开发中,不同框架(如 EJB、Spring、Web 容器)各自定义了相似但不兼容的注解(例如 @Init、@Destroy),导致:
- 代码与特定框架强耦合
- 跨平台/跨容器迁移困难
- 学习成本高
JSR 250 通过提供 官方标准注解,解决了这些碎片化问题。
二、JSR 250 的核心注解(位于 javax.annotation 包)
| 注解 | 作用 | 典型场景 |
|---|---|---|
@PostConstruct |
标记初始化方法,在依赖注入完成后自动调用 | Bean 初始化逻辑(如加载缓存、建立连接) |
@PreDestroy |
标记销毁方法,在 Bean 销毁前自动调用 | 资源清理(如关闭数据库连接、释放文件句柄) |
@Resource |
声明对资源的依赖(如 DataSource、JMS Queue),支持按名称注入 | 注入 JNDI 资源或 Spring 管理的 Bean |
@Generated |
标记代码由工具自动生成(供 IDE 或编译器识别) | 代码生成工具(如 JAXB、APT) |
@ManagedBean(已弃用) |
声明 JSF 托管 Bean(Jakarta EE 中已移除) | 旧版 JSF 应用 |
✅ 最常用的是前三个:
@PostConstruct、@PreDestroy、@Resource
三、关键特性详解
1. 生命周期回调:@PostConstruct / @PreDestroy
java
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class DatabaseService {
@PostConstruct
public void init() {
// 依赖注入完成后执行(如 dataSource 已注入)
System.out.println("Database connection pool initialized");
}
@PreDestroy
public void cleanup() {
// 容器关闭前执行
System.out.println("Database connection pool closed");
}
}
- 执行时机:由容器(如 Spring、EJB 容器)保证顺序和线程安全
- 替代方案 :Spring 的
@PostConstruct功能相同;也可实现InitializingBean/DisposableBean,但侵入性强
2. 资源注入:@Resource
java
import javax.annotation.Resource;
import javax.sql.DataSource;
public class UserService {
// 按名称注入(默认使用字段名 "dataSource")
@Resource
private DataSource dataSource;
// 显式指定资源名
@Resource(name = "myDB")
private DataSource db;
}
- 注入来源 :
- Java EE:JNDI 上下文中的资源
- Spring:容器中匹配名称或类型的 Bean
- 与
@Autowired对比 :@Resource默认按 名称 匹配(JSR 250 标准)@Autowired默认按 类型 匹配(Spring 特有)
四、与相关规范的关系
| 规范 | 关系 |
|---|---|
| JSR 330(Dependency Injection) | 专注依赖注入(@Inject),而 JSR 250 专注生命周期和资源管理 |
| Spring Framework | 完全支持 JSR 250 注解(需注册 CommonAnnotationBeanPostProcessor) |
| Jakarta EE | JSR 250 是 Jakarta EE 的基础组件之一(包名已迁移到 jakarta.annotation) |
💡 最佳实践:在 Spring 项目中,可混合使用:
@Autowired(按类型注入)@Resource(按名称注入)@PostConstruct/@PreDestroy(生命周期管理)
五、注意事项
-
Java 9+ 模块化影响
javax.annotation不再默认包含在 JDK 中,需显式添加依赖:xml<!-- Maven --> <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency> -
Jakarta EE 迁移
在 Jakarta EE 9+ 中,包名已从
javax.annotation改为jakarta.annotation。 -
@Resource的回退机制当按名称找不到资源时,部分容器(如 Spring)会回退到按类型匹配(可通过配置关闭)。
六、总结
| 项目 | 内容 |
|---|---|
| JSR 编号 | 250 |
| 规范名称 | Common Annotations for the Java Platform |
| 核心价值 | 提供标准化的生命周期管理和资源注入注解 |
| 最常用注解 | @PostConstruct, @PreDestroy, @Resource |
| 适用平台 | Java SE 6+, Java EE 5+, Spring, Jakarta EE |
| 典型用途 | Bean 初始化/销毁、注入数据源、解耦框架依赖 |
🔑 JSR 250 是 Java 企业开发的"隐形基石" ------ 虽然简单,却让代码更清晰、更可移植、更符合标准。
官方文档(Jakarta 版本):
https://jakarta.ee/specifications/common-annotations/