前言:
Jakarta EE从研究Spring框架所做的工作中获益良多。Jakarta EE规范可以采用并标准化Spring框架已经使之成为行业标准的技术和实践。了解为什么Spring对Jakarta EE很重要,以及Jakarta EE如何影响Spring!
Jakarta Annotations 定义了一组注释,这些注释表示常见的语义概念,这些概念支持适用于各种 Java 技术的声明式编程
jakarta.annotation.Resource
Resource 注解用于声明对资源的引用。它可以在类、方法或字段上指定。当注解应用于字段或方法时,容器将在初始化应用程序时将所请求资源的实例注入到应用程序中。如果注解作用在类上,则注解声明应用程序将在运行时查找的资源。
@Resource的属性
name:
name 元素是资源的 JNDI 名称。当 Resource 注释应用于字段时,name 元素的默认值是由类名限定的字段名称。当应用于方法时,默认值是与类名限定的方法相对应的 JavaBeans 属性名称。当应用于类时,没有默认值,并且必须指定名称。
type:
type 元素定义资源的 Java 类型。当 Resource 注释应用于字段时,type 元素的默认值是字段的类型。当应用于方法时,默认值为 JavaBeans 属性的类型。当应用于类时,没有 default,并且必须指定 type。使用时,类型必须与赋值兼容。
基于Field的注入:
@Resource注解作用在Field上,如果注解中没有显示的指定name和type,则可以通过查看字段声明本身来推断它们。如果 Resource 注解指定的类型与字段的类型不兼容,则会出错。
Example:
@Resource
private DataSource myDB;
//-------------------------------
@Resource(name="customerDB")
private DataSource myDB;
基于Setter的注入:
@Resource资源作用在setter方法上(Setter方法是一种符合特定规范的自定义方法,能被容器识别,比如setFieldName方法)。如有必要,可以通过检查方法声明来推断资源的名称和类型。如果未声明,则资源的名称是根据 setter 方法的名称确定的 JavaBeans 属性的名称。setter 方法必须遵循标准的 JavaBeans 约定 — 名称以 “ set ” 开头;返回类型为 void ;并且只有一个参数。此外,参数的类型必须与 Resource 注解的 type 元素兼容(如果指定)。
Example:
@Resource
private void setMyDB(DataSource ds) {
myDB = ds;
}
private DataSource myDB;
//----------------------------
@Resource(name="customerDB")
private void setMyDB(DataSource ds) {
myDB = ds;
}
private DataSource myDB;
jakarta.annotation.Resources
Resource 注解用于声明对资源的引用。Resources 注解充当多个资源声明的容器。
Example:
@Resources ({
@Resource(name="myDB", type=javax.sql.DataSource),
@Resource(name="myMQ", type=jakarta.jms.ConnectionFactory)
})
public class CalculatorBean {
// ...
}
jakarta.annotation.PostConstruct
PostConstruct 注解用于需要在完成依赖注入后执行以执行任何初始化的方法。在类投入使用之前,必须调用此方法。所有支持依赖关系注入的类都必须支持此注解。必须调用带有 PostConstruct 注释的方法,即使该类不请求注入任何资源。
Example:
@Resource
private void setMyDB(DataSource ds) {
myDB = ds;
}
@PostConstruct
private void initialize() {
// Initialize the connection object from the DataSource
connection = myDB.getConnection();
}
private DataSource myDB;
private Connection connection;
jakarta.annotation.PreDestroy
PreDestroy 注解在方法上用作回调通知,以指示容器正在删除该实例。使用 PreDestroy 注释的方法通常用于释放实例一直持有的资源。
Example:
@Resource
private void setMyDB(DataSource ds) {
myDB = ds;
}
@PostConstruct
private void initialize() {
// Initialize the connection object from the DataSource
connection = myDB.getConnection();
}
@PreDestroy
private void cleanup() {
// Close the connection to the DataSource.
connection.close();
}
private DataSource myDB;
private Connection connection;
jakarta.annotation.Priority
Priority 注释可以应用于任何程序元素,以指示应按什么顺序使用它们。在任何特定实例中使用 Priority 注释的效果由定义特定类使用的其他规范定义。例如,Jakarta Interceptors 规范定义了对拦截器使用优先级来控制拦截器的调用顺序。
优先级值通常应为非负值,负值保留用于特殊含义,例如“未定义”或“未指定”。定义 Priority 注释使用的规范可以定义允许的优先级范围和任何具有特殊含义的优先级值。
jakarta.annotation.Nonnull
Nonnull 注释用于标记不能为 null 的元素。
Method - 返回类型永远不会为 null
Parameter - 参数不能为 null
Field - 完成对象构造后,field 不能为 null
Example:
public interface StockQuoteService {
@Nonnull
BigDecimal quote(@Nonnull String marker);
}
jakarta.annotation.Nullable
Nullable 注解用于标记可能为 null 的元素。
Method - 返回类型可能为 null
Parameter - 参数可能为空
Field - 字段可能为 null
Example:
public interface StockQuoteService {
BigDecimal quote(String marker, @Nullable BigDecimal defaultValue);
}