Java注解从入门到精通:一文掌握项目开发中的常用注解
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特性。
核心作用
-
自动开启/提交/回滚事务
-
隔离级别控制
-
传播行为控制
-
超时控制
-
只读事务优化
隔离级别
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项目开发中如虎添翼,大幅提升编码效率和代码质量。建议在实际项目中多练习、多总结,形成自己的注解知识体系。
本文为原创技术分享,欢迎点赞、收藏、转发!
更多推荐

所有评论(0)