Java注解从入门到精通:一文掌握项目开发中的常用注解

在Java开发中,注解(Annotation)就像代码中的“元数据标签”,它们不直接改变程序逻辑,却能在编译时、运行时为框架和工具提供关键信息。无论是Spring Boot的自动配置,还是Lombok的代码简化,注解都扮演着核心角色。本文将系统梳理Java注解体系,助你轻松掌握项目开发中的常用注解。


一、注解的分类

在Java注解体系中,元注解、标准注解和自定义注解是三个核心概念,它们各自承担不同的角色。

1. 元注解:注解的注解

元注解用于修饰其他注解,定义注解的行为(如作用目标、保留策略等),是构建自定义注解的基础。

元注解 作用
@Target 指定注解可用位置(方法、字段、类等)
@Retention 指定保留策略(源码级、编译期、运行时)
@Documented 将注解包含到JavaDoc中
@Inherited 允许子类继承父类的注解
@Repeatable 允许在同一位置重复使用同一注解

自定义元注解示例:

java

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyMetaAnnotation {
    String value() default "default";
}

2. 标准注解:JDK内置

标准注解是JDK内置的,用于编译时检查、运行时处理或文档生成。

注解 作用
@Override 检查方法是否正确覆盖父类方法
@Deprecated 标记已过时的元素
@SuppressWarnings 抑制编译器警告
@SafeVarargs 抑制泛型可变参数警告
@FunctionalInterface 标记函数式接口
@Native 标记原生类型常量

3. 自定义注解:开发者定义

开发者根据业务需求自定义注解,通常结合元注解和反射或AOP使用。

示例:定义日志标记注解

java

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
    String value() default "default";
}

通过反射读取注解:

java

Method method = MyService.class.getMethod("longRunningMethod");
if (method.isAnnotationPresent(Loggable.class)) {
    Loggable loggable = method.getAnnotation(Loggable.class);
    System.out.println("Loggable value: " + loggable.value());
}

二、Java核心注解

注解 说明
@Override 表示方法重写父类或接口中的方法
@Deprecated 标记已过时的类、方法或字段
@SuppressWarnings 抑制编译器警告
@SafeVarargs 抑制泛型可变参数的类型安全警告
@FunctionalInterface 标记接口为函数式接口
@Native 标记字段为原生类型

三、Spring框架注解

核心注解

注解 作用
@SpringBootApplication Spring Boot应用入口(复合注解)
@Component 通用组件标记,纳入Spring容器管理
@Service 标记业务逻辑层组件
@Repository 标记数据访问层组件
@Controller 标记MVC控制器
@RestController @Controller + @ResponseBody组合
@Configuration 标记配置类,替代XML配置
@Bean 在配置类中定义Bean

依赖注入注解

注解 作用
@Autowired 按类型自动注入依赖
@Qualifier 配合@Autowired按名称指定Bean
@Resource J2EE标准,按名称注入
@Inject JSR-330标准依赖注入
@Value 注入配置文件中的属性值

请求映射注解

注解 作用
@RequestMapping 映射HTTP请求路径和方法
@GetMapping 映射GET请求
@PostMapping 映射POST请求
@PutMapping 映射PUT请求
@DeleteMapping 映射DELETE请求

事务与切面注解

注解 作用
@Transactional 声明事务管理
@Aspect 标记切面类
@Pointcut 定义切点表达式
@Before 前置通知
@After 后置通知
@Around 环绕通知

异步与定时任务

注解 作用
@EnableAsync 开启异步任务支持
@Async 标记异步执行方法
@EnableScheduling 开启定时任务支持
@Scheduled 定义定时任务

缓存注解

注解 作用
@EnableCaching 开启缓存支持
@Cacheable 标记方法结果可缓存
@CachePut 更新缓存
@CacheEvict 清除缓存

外卖项目中的缓存实践:

java

@Service
public class SetmealService {
    
    @Cacheable(value = "setmeal", key = "#id")
    public Setmeal getById(Long id) {
        return setmealMapper.selectById(id);
    }
    
    @CacheEvict(value = "setmeal", key = "#setmeal.id")
    public void update(Setmeal setmeal) {
        setmealMapper.updateById(setmeal);
    }
    
    @CacheEvict(value = "setmeal", allEntries = true)
    public void deleteBatch(List<Long> ids) {
        setmealMapper.deleteBatchIds(ids);
    }
}

四、Web开发注解

注解 作用
@RequestBody 从请求体读取JSON并反序列化
@ResponseBody 将返回值转为HTTP响应体
@PathVariable 从URL路径获取参数
@RequestParam 从请求参数获取值
@CookieValue 从Cookie获取值
@RequestHeader 获取请求头信息
@CrossOrigin 处理跨域请求

@Controller vs @RestController

  • @Controller:返回视图名称,通过视图解析器渲染HTML页面

  • @RestController:返回数据直接写入响应体(JSON/XML),用于RESTful API


五、数据验证注解(Bean Validation)

注解 作用
@NotNull 验证不为null
@NotEmpty 验证不为空(字符串或集合)
@NotBlank 验证不为空白(字符串)
@Size 验证长度或大小
@Email 验证邮箱格式
@Min / @Max 验证数值范围
@Pattern 验证正则匹配

六、数据库相关注解(JPA/Hibernate)

注解 作用
@Entity 标记数据库实体
@Table 指定数据库表名
@Id 标记主键字段
@GeneratedValue 配置主键生成策略
@Column 定义字段与列映射
@OneToMany / @ManyToOne 一对多/多对一关系
@ManyToMany 多对多关系
@JoinColumn 定义外键关联
@Query 自定义JPQL或原生SQL

七、测试相关注解

注解 作用
@Test 标记测试方法
@BeforeEach / @AfterEach 每个测试方法前后执行
@BeforeAll / @AfterAll 所有测试方法前后执行
@Mock 模拟依赖对象(Mockito)
@InjectMocks 自动注入模拟对象
@SpringBootTest 启动完整Spring上下文
@MockBean 模拟并替换Spring Bean
@ParameterizedTest 参数化测试

八、Lombok注解

Lombok通过注解自动生成样板代码,极大提升开发效率。

注解 作用
@Data 生成getter/setter、equals、hashCode、toString
@Getter / @Setter 生成getter或setter
@NoArgsConstructor 生成无参构造
@AllArgsConstructor 生成全参构造
@ToString 生成toString方法
@Slf4j 自动生成日志对象
@Builder 提供建造者模式支持

@Builder 详解

@Builder自动生成建造者模式代码,使对象创建更加灵活可读。

使用示例:

java

@Builder
@ToString
public class User {
    private String name;
    private int age;
    private String email;
}

// 链式调用创建对象
User user = User.builder()
    .name("Alice")
    .age(25)
    .email("alice@example.com")
    .build();

处理final字段:

java

@Builder
public class User {
    @Builder.Default
    private final String name = "Unknown";
    @Builder.Default
    private final int age = 0;
}

最佳实践:

  • 推荐用于DTO、POJO、配置类,特别是参数较多的情况

  • 结合@ToString@EqualsAndHashCode提高开发效率

  • 简单对象可直接用@AllArgsConstructor + @Setter


九、其他常用注解

JSON处理(Jackson)

注解 作用
@JsonIgnore 忽略字段序列化
@JsonProperty 自定义JSON字段名
@JsonFormat 定义日期/时间格式

@JsonFormat 示例:

java

public class User {
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date birthDate;
    
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
}

日期绑定(Spring)

@DateTimeFormat用于将字符串参数自动绑定到日期类型:

java

@GetMapping("/query")
public String queryByDate(
    @RequestParam("date")
    @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
    return "Received: " + date;
}

API文档(Swagger)

注解 作用
@ApiOperation 描述API接口功能
@ApiParam 描述接口参数
@EnableSwagger2 开启Swagger支持

微服务相关

注解 作用
@FeignClient 声明Feign客户端(Spring Cloud)
@HystrixCommand 定义熔断器逻辑
@Retryable 定义方法级重试机制
@CircuitBreaker 实现断路器模式

十、@Transactional 详解

@Transactional是Spring声明式事务管理的核心注解,通过AOP确保数据库操作的ACID特性。

核心作用

  1. 自动开启/提交/回滚事务

  2. 隔离级别控制

  3. 传播行为控制

  4. 超时控制

  5. 只读事务优化

隔离级别

java

@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateData() { ... }
级别 说明
DEFAULT 使用数据库默认隔离级别
READ_UNCOMMITTED 读未提交(最低)
READ_COMMITTED 读已提交(避免脏读)
REPEATABLE_READ 可重复读
SERIALIZABLE 串行化(最高)

传播行为

java

@Transactional(propagation = Propagation.REQUIRED)
public void nestedMethod() { ... }
行为 说明
REQUIRED(默认) 加入当前事务,若无则新建
SUPPORTS 支持当前事务,若无则以非事务方式执行
MANDATORY 必须存在事务,否则抛异常
REQUIRES_NEW 新建事务,挂起当前事务
NOT_SUPPORTED 非事务方式执行,挂起当前事务
NEVER 非事务方式执行,存在事务则抛异常
NESTED 嵌套事务

超时与只读

java

@Transactional(timeout = 3)  // 3秒超时
@Transactional(readOnly = true)  // 只读优化

十一、@SpringBootApplication 详解

@SpringBootApplication是Spring Boot的启动入口注解,它是以下三个注解的复合:

java

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

复合注解的三大功能

注解 功能
@Configuration 标记配置类,定义Bean
@EnableAutoConfiguration 开启自动配置机制
@ComponentScan 自动扫描组件

自动配置原理:

  • @EnableAutoConfiguration通过AutoConfigurationImportSelector扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件

  • 配合@Conditional注解族(如@ConditionalOnClass@ConditionalOnMissingBean)控制配置生效条件


总结

类型 说明 典型代表
元注解 修饰其他注解,定义行为 @Target@Retention
标准注解 JDK内置,编译/运行时使用 @Override@Deprecated
自定义注解 开发者按需定义 @Loggable
框架注解 第三方框架提供 Spring、JPA、Lombok等

掌握这些常用注解,能让你在Java项目开发中如虎添翼,大幅提升编码效率和代码质量。建议在实际项目中多练习、多总结,形成自己的注解知识体系。


本文为原创技术分享,欢迎点赞、收藏、转发!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐