Java常用注解擴展對比舉例詳解
一、@Controller 與 @RestController 對比
對比維度 | @Controller | @RestController |
---|---|---|
定義 | Spring MVC 的基礎(chǔ)控制器注解 | @Controller + @ResponseBody 的組合注解 |
返回值處理 | 返回視圖名稱(需配合視圖解析器) | 直接返回JSON/XML數(shù)據(jù)(自動添加 @ResponseBody ) |
適用場景 | 傳統(tǒng)MVC架構(gòu)(如JSP/Thymeleaf頁面渲染) | RESTful API開發(fā)(前后端分離場景) |
HTTP響應(yīng)頭 | Content-Type: text/html (默認) | Content-Type: application/json (默認) |
代碼示例 | ```java | ```java |
@Controller | @RestController | |
public class WebCtrl { | public class ApiCtrl { | |
@GetMapping(“/page”) | @GetMapping(“/data”) | |
public String page() { | public User data() { | |
return “index”; // 返回視圖名 | return userService.findUser(); // 自動轉(zhuǎn)JSON | |
} | } | |
} | } |
二、使用 @Data 與 不使用 @Data 對比
對比維度 | 使用 @Data | 不使用 @Data |
---|---|---|
代碼量 | 自動生成以下方法: - 所有字段的getter/setter - toString() - equals() /hashCode() | 需手動編寫所有方法 |
維護性 | 字段增減時無需修改方法 | 字段變更需同步修改相關(guān)方法 |
繼承關(guān)系處理 | 需顯式添加 @EqualsAndHashCode(callSuper=true) 包含父類字段 | 手動編寫時可直接控制是否包含父類字段 |
框架兼容性 | 依賴Lombok插件(需IDE支持) | 無額外依賴 |
代碼示例 | ```java | ```java |
@Data | public class User { | |
public class User { | private Long id; | |
private Long id; | private String name; | |
private String name; | ||
// 自動生成所有方法 | // 手動編寫getter/setter | |
} | public Long getId() { return id; } | |
public void setId(Long id) { this.id = id; } | ||
// …其他方法 | ||
} |
注意事項:
- 使用
@Data
時,若類有繼承關(guān)系,需添加@EqualsAndHashCode(callSuper=true)
- 某些場景(如JPA實體類)需顯式定義無參構(gòu)造器(通過
@NoArgsConstructor
)
三、使用 @TableName 與 不使用 @TableName 對比
對比維度 | 使用 @TableName | 不使用 @TableName |
---|---|---|
表名映射規(guī)則 | 顯式指定數(shù)據(jù)庫表名(如 @TableName("sys_user") ) | 按MyBatis-Plus默認規(guī)則映射: 類名駝峰轉(zhuǎn)下劃線(如 SysUser → sys_user ) |
適用場景 | 1. 表名含特殊字符(如 user-info )2. 類名與表名無對應(yīng)關(guān)系 | 類名與表名嚴格遵循駝峰轉(zhuǎn)下劃線規(guī)則 |
全局配置覆蓋 | 優(yōu)先級高于全局配置 | 可通過配置文件統(tǒng)一設(shè)置表名前綴:mybatis-plus.global-config.db-config.table-prefix=sys_ |
代碼示例 | ```java | ```java |
@Data | @Data | |
@TableName(“sys_user”) // 顯式指定表名 | public class SysUser { // 默認映射為 sys_user | |
public class User { | private Long id; | |
private Long id; | } | |
} |
注意事項:
- 表名包含SQL關(guān)鍵字時需轉(zhuǎn)義:
@TableName("
order")
- 分表場景可通過動態(tài)表名處理器(
TableNameHandler
)實現(xiàn)
四、依賴注入注解對比
注解對 | 核心區(qū)別 | 使用場景 |
---|---|---|
@Autowired vs @Resource | - @Autowired (Spring)按類型注入- @Resource (JSR-250)按名稱注入 | 明確指定Bean名稱時用@Resource ,優(yōu)先使用構(gòu)造器注入時用@Autowired |
@Primary vs @Qualifier | - @Primary 標記首選Bean- @Qualifier 指定具體Bean名稱 | 存在多個相同類型Bean時,優(yōu)先使用@Primary ,需精確控制時用@Qualifier |
代碼示例:
// @Autowired + @Qualifier @Autowired @Qualifier("mysqlDataSource") private DataSource dataSource; // @Resource @Resource(name = "oracleDataSource") private DataSource dataSource;
五、Spring MVC 參數(shù)綁定注解對比
注解對 | 核心區(qū)別 | 使用場景 |
---|---|---|
@RequestParam vs @PathVariable | - @RequestParam 獲取URL參數(shù)- @PathVariable 獲取URI模板變量 | RESTful風(fēng)格URL用@PathVariable ,傳統(tǒng)表單參數(shù)用@RequestParam |
@ModelAttribute vs @RequestBody | - @ModelAttribute 綁定Form表單數(shù)據(jù)- @RequestBody 綁定JSON請求體 | 表單提交用@ModelAttribute ,API接口傳輸復(fù)雜對象用@RequestBody |
代碼示例:
// PathVariable @GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { ... } // RequestBody @PostMapping("/users") public ResponseEntity<?> createUser(@RequestBody UserDTO userDTO) { ... }
六、JPA/Hibernate 映射注解對比
注解對 | 核心區(qū)別 | 使用場景 |
---|---|---|
@Entity vs @Table | - @Entity 聲明JPA實體類- @Table 指定數(shù)據(jù)庫表名 | 類名與表名不一致時使用@Table |
@Column vs @Transient | - @Column 映射數(shù)據(jù)庫列- @Transient 標記非持久化字段 | 字段需要特殊列名或類型時用@Column ,臨時計算字段用@Transient |
@OneToMany vs @ManyToOne | - 定義一對多/多對一關(guān)系 | 根據(jù)業(yè)務(wù)關(guān)系方向選擇(部門-員工:部門用@OneToMany ,員工用@ManyToOne ) |
代碼示例:
@Entity @Table(name = "departments") public class Department { @OneToMany(mappedBy = "department") private List<Employee> employees; } @Entity public class Employee { @ManyToOne @JoinColumn(name = "dept_id") private Department department; }
七、Spring Boot 配置注解對比
注解對 | 核心區(qū)別 | 使用場景 |
---|---|---|
@Value vs @ConfigurationProperties | - @Value 注入單個屬性- @ConfigurationProperties 批量綁定屬性 | 簡單配置用@Value ,復(fù)雜配置對象用@ConfigurationProperties |
@Profile vs @Conditional | - @Profile 按環(huán)境激活配置- @Conditional 按條件創(chuàng)建Bean | 多環(huán)境配置用@Profile ,動態(tài)裝配邏輯用@Conditional |
配置示例:
# application.yml app: security: enabled: true timeout: 300
代碼實現(xiàn):
@Configuration @ConfigurationProperties(prefix = "app.security") public class SecurityConfig { private boolean enabled; private int timeout; // getters/setters }
八、Lombok 注解對比
注解對 | 核心區(qū)別 | 使用場景 |
---|---|---|
@Data vs @Value | - @Data 生成可變對象- @Value 生成不可變對象(final字段) | 需要修改字段值時用@Data ,只讀數(shù)據(jù)傳輸對象用@Value |
@Builder vs @AllArgsConstructor | - @Builder 支持鏈式構(gòu)建- @AllArgsConstructor 生成全參構(gòu)造器 | 復(fù)雜對象構(gòu)建用@Builder ,依賴注入全參構(gòu)造用@AllArgsConstructor |
代碼示例:
@Value @Builder public class ImmutablePoint { private final int x; private final int y; } // 使用 ImmutablePoint point = ImmutablePoint.builder().x(10).y(20).build();
九、事務(wù)管理注解對比
注解對 | 核心區(qū)別 | 使用場景 |
---|---|---|
@Transactional vs @Modifying | - @Transactional 聲明事務(wù)邊界- @Modifying 標記DML操作 | 服務(wù)層方法用@Transactional ,JPA更新查詢用@Modifying |
代碼示例:
@Service public class UserService { @Transactional public void updateUser(User user) { userRepository.save(user); } } @Repository public interface UserRepository extends JpaRepository<User, Long> { @Modifying @Query("UPDATE User u SET u.name = ?1 WHERE u.id = ?2") int updateNameById(String name, Long id); }
十、測試相關(guān)注解對比
注解對 | 核心區(qū)別 | 使用場景 |
---|---|---|
@Mock vs @MockBean | - @Mock (Mockito)創(chuàng)建模擬對象- @MockBean (Spring Boot Test)替換Spring容器中的Bean | 單元測試用@Mock ,集成測試用@MockBean |
@SpringBootTest vs @WebMvcTest | - @SpringBootTest 加載完整上下文- @WebMvcTest 僅加載Web層組件 | 全集成測試用@SpringBootTest ,控制層隔離測試用@WebMvcTest |
測試示例:
// 全集成測試 @SpringBootTest class UserServiceIntegrationTest { @Autowired private UserService userService; } // 控制層測試 @WebMvcTest(UserController.class) class UserControllerTest { @MockBean private UserService userService; @Autowired private MockMvc mockMvc; }
綜合對比總結(jié)表
功能場景 | 推薦注解組合 | 典型應(yīng)用 |
---|---|---|
REST API開發(fā) | @RestController + @RequestBody + @Valid | 前后端分離接口開發(fā) |
JPA實體映射 | @Entity + @Table + @Column + @OneToMany | 數(shù)據(jù)庫表結(jié)構(gòu)映射 |
配置管理 | @ConfigurationProperties + @Profile | 多環(huán)境配置切換 |
測試覆蓋 | @SpringBootTest + @MockBean + @DataJpaTest (按需選擇) | 分層測試策略 |
依賴注入 | 構(gòu)造器注入優(yōu)先,@Autowired + @Qualifier | 避免循環(huán)依賴 |
最佳實踐建議
分層使用嚴格遵循Controller→Service→Repository分層架構(gòu),避免跨層注解混用。
注解最小化
- 優(yōu)先使用框架提供的組合注解(如
@RestController
代替@Controller
+@ResponseBody
) - 避免重復(fù)注解(如同時使用
@Component
和@Service
)
- 優(yōu)先使用框架提供的組合注解(如
Lombok規(guī)范
- 實體類統(tǒng)一使用
@Data
+@Builder
- 禁用無約束的
@AllArgsConstructor
- 實體類統(tǒng)一使用
事務(wù)控制
- Service層統(tǒng)一聲明
@Transactional(readOnly = true)
- 寫操作顯式指定
@Transactional(rollbackFor = Exception.class)
- Service層統(tǒng)一聲明
測試隔離
- 單元測試使用Mockito + JUnit5
- 集成測試按需選擇
@WebMvcTest
或@DataJpaTest
通過系統(tǒng)化的注解對比與組合使用,可顯著提高代碼規(guī)范性和團隊協(xié)作效率。建議結(jié)合SonarLint等代碼質(zhì)量管理工具,確保注解使用的合理性與一致性。
總結(jié)
到此這篇關(guān)于Java常用注解擴展對比的文章就介紹到這了,更多相關(guān)Java常用注解擴展內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot將mybatis升級為mybatis-plus的實現(xiàn)
之前項目工程用的是mybatis,現(xiàn)在需要將其替換為mybatis-plus,本文主要介紹了springboot將mybatis升級為mybatis-plus的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-09-09Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題詳析
在Java和MySQL中小數(shù)的精度可能會受到限制,如float類型的小數(shù)只能精確到6-7位,double類型也只能精確到15-16位,這篇文章主要給大家介紹了關(guān)于Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題,需要的朋友可以參考下2024-01-01Spring Cloud Hystrix 服務(wù)容錯保護的原理實現(xiàn)
這篇文章主要介紹了Spring Cloud Hystrix 服務(wù)容錯保護的原理實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05Spring IOC簡單理解及創(chuàng)建對象的方式
這篇文章主要介紹了Spring IOC簡單理解及創(chuàng)建對象的方式,本文通過兩種方式給大家介紹創(chuàng)建對象的方法,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-09-09