javax.annotation 包提供了一组通用的注解,最初是 Java EE (现在称为 Jakarta EE) 的一部分。这些注解主要用于标记代码的元数据,帮助开发工具、框架和运行时环境理解代码的语义。
用于依赖注入,可以注入资源、EJB、数据源等。
import javax.annotation.Resource;
import javax.sql.DataSource;
public class UserService {
@Resource(name = "jdbc/UserDB")
private DataSource dataSource;
@Resource
private UserRepository userRepository;
public void processUser() {
// 使用注入的dataSource和userRepository
}
}标记在依赖注入完成后执行的方法。
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class DatabaseInitializer {
@PostConstruct
public void initialize() {
System.out.println("数据库连接初始化...");
// 执行初始化逻辑
}
@PreDestroy
public void cleanup() {
System.out.println("清理数据库资源...");
// 执行清理逻辑
}
}标记在对象销毁前执行的方法。
标记自动生成的代码。
import javax.annotation.Generated;
@Generated(value = "com.example.CodeGenerator",
date = "2024-01-01T10:00:00",
comments = "自动生成的DTO类")
public class UserDTO {
private String name;
private String email;
// 自动生成的getter/setter
}标记托管Bean(在Java EE环境中)。
import javax.annotation.ManagedBean;
import javax.enterprise.context.RequestScoped;
@ManagedBean
@RequestScoped
public class LoginBean {
private String username;
private String password;
public String login() {
// 登录逻辑
return "success";
}
// getter和setter
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}import javax.annotation.*;
import javax.sql.DataSource;
import java.util.logging.Logger;
/**
* 用户服务类示例
*/
public class UserService {
private static final Logger logger = Logger.getLogger(UserService.class.getName());
@Resource(lookup = "java:comp/env/jdbc/userDS")
private DataSource dataSource;
private boolean initialized = false;
@PostConstruct
public void init() {
logger.info("UserService初始化开始...");
try {
// 验证数据源连接
dataSource.getConnection();
initialized = true;
logger.info("UserService初始化完成");
} catch (Exception e) {
logger.severe("初始化失败: " + e.getMessage());
}
}
@PreDestroy
public void destroy() {
logger.info("UserService销毁开始...");
// 清理资源
initialized = false;
logger.info("UserService已销毁");
}
public void processUserData(String userId) {
if (!initialized) {
throw new IllegalStateException("服务未初始化");
}
// 处理用户数据的业务逻辑
logger.info("处理用户数据: " + userId);
}
// 使用@Resource进行方法级别注入
private UserRepository userRepository;
@Resource
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
// 辅助类
class UserRepository {
public void save(User user) {
// 保存用户逻辑
}
}
class User {
private String id;
private String name;
// getter和setter
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}如果你在标准的 Java SE 项目中使用这些注解,需要添加依赖:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>1、Java EE 到 Jakarta EE 的迁移:在较新的 Jakarta EE 版本中,这些注解已迁移到 jakarta.annotation 包
2、Spring 框架:Spring 提供了自己的注解(如 @Autowired),但也可以使用 @Resource
3、生命周期管理:@PostConstruct 和 @PreDestroy 在 Spring 和 Java EE 容器中都得到支持
4、这些注解为 Java 应用程序提供了标准的元数据标记方式,有助于实现更清晰、更易维护的代码结构。