注解就像是给Java代码贴的"便利贴",它们不会改变代码本身的逻辑,但能给编译器、开发工具或运行时环境提供额外信息。下面我用最通俗的方式解释Java中最常用的注解:
一、基础篇:人人必知的注解
1. `@Override` - "我是重写的!"
• 贴在方法上,告诉编译器:"这个方法是我从爸爸类(父类)那里继承来后改写的"
• 如果实际上没重写任何方法,编译器会报错提醒你
• 例子:
```java
@Override
public String toString() { return "我是重写过的toString"; }
```
2. `@Deprecated` - "过时了,别用了!"
• 贴在类、方法或字段上,相当于挂个"即将停用"的牌子
• 用了带这个标记的代码,编译器会给出警告
• 例子:
```java
@Deprecated
public void oldMethod() { ... } // 这个方法以后要淘汰了
```
3. `@SuppressWarnings` - "别吵,我知道有问题!"
• 让编译器"闭嘴",不要显示某些警告
• 常用参数:`"unchecked"`(忽略泛型警告)、`"deprecation"`(忽略过时API警告)
• 例子:
```java
@SuppressWarnings("unchecked")
List list = new ArrayList(); // 我知道没写泛型,别提醒我了
```
二、框架篇:Spring家族常用注解
4. `@Controller` / `@Service` / `@Repository` - "我是特种兵!"
• Spring给不同角色的类贴的标签:
◦ `@Controller`:处理网页请求的"门卫"
◦ `@Service`:处理业务的"服务员"
◦ `@Repository`:管数据库的"仓库管理员"
• 例子:
```java
@Controller
public class UserController { ... } // 我是处理用户请求的
```
5. `@Autowired` - "快给我找个合适的来!"
• 贴在字段或构造方法上,相当于说:"Spring大哥,帮我自动找个合适的对象塞进来"
• 例子:
```java
@Autowired
private UserService userService; // 随便给我个UserService就行
```
6. `@RequestMapping` - "找我请按门牌号!"
• 贴在Controller类或方法上,定义访问路径
• 例子:
```java
@RequestMapping("/user")
public class UserController {
@RequestMapping("/list")
public String list() { ... } // 访问路径是 /user/list
}
```
三、偷懒神器:Lombok注解
7. `@Getter` / `@Setter` - "别写get/set方法了!"
• 自动生成字段的getter和setter方法
• 例子:
```java
@Getter @Setter
public class User {
private String name; // 自动生成getName()和setName()
}
```
8. `@Data` - "全家桶套餐!"
• 一次性包含`@Getter`、`@Setter`、`@ToString`、`@EqualsAndHashCode`等
• 例子:
```java
@Data
public class User {
private String name;
private int age; // 自动生成所有常用方法
}
```
9. `@Builder` - "链式构造了解一下!"
• 自动生成建造者模式的代码
• 例子:
```java
@Builder
public class User {
private String name;
private int age;
}
// 使用:User.builder().name("张三").age(20).build();
```
四、测试篇:JUnit注解
10. `@Test` - "我是测试用例!"
◦ 标记这是一个测试方法
◦ 例子:
```java
@Test
public void testAdd() {
assertEquals(3, 1+2); // 测试1+2是否等于3
}
```
11. `@Before` / `@After` - "测试前后我要做点事!"
◦ `@Before`:每个测试方法执行前先执行我
◦ `@After`:每个测试方法执行后要执行我
◦ 例子:
```java
@Before
public void setUp() { System.out.println("测试要开始了"); }
@After
public void tearDown() { System.out.println("测试结束了"); }
```
五、数据库篇:JPA/Hibernate注解
12. `@Entity` - "我是数据库表!"
◦ 标记这个类对应数据库中的一张表
◦ 例子:
```java
@Entity
public class User { ... } // 对应数据库user表
```
13. `@Id` - "我是主键!"
◦ 标记这个字段是表的主键
◦ 例子:
```java
@Id
private Long id; // 这是主键字段
```
14. `@Column` - "我是表字段!"
◦ 标记字段对应表的列,可以指定列名等属性
◦ 例子:
```java
@Column(name = "user_name")
private String name; // 对应user_name列
```
总结:注解就像便利贴
• 给编译器看的:如`@Override`、`@Deprecated`
• 给框架看的:如Spring的`@Controller`、JPA的`@Entity`
• 给工具看的:如Lombok的各种注解
• 给测试工具看的:如JUnit的各种注解
记住:注解本身不做任何事情,它们只是提供信息,真正干活的是读取这些注解的处理器或框架!