注解就像是給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的各種注解
記住:注解本身不做任何事情,它們只是提供信息,真正干活的是讀取這些注解的處理器或框架!