1. @SpringBootApplication
- 詳細解析:
組合注解,包含@Configuration
(標記配置類)、@EnableAutoConfiguration
(開啟自動配置)、@ComponentScan
(組件掃描)。啟動類標注后,Spring Boot 會自動完成組件掃描、配置類加載和自動配置邏輯。 - 注意事項:
通常放在項目根包下(如com.example.demo
),確保@ComponentScan
能掃描到所有子包中的組件。若需自定義掃描范圍,可通過scanBasePackages
屬性指定。 - 示例:
@SpringBootApplication(scanBasePackages = "com.example.service")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
- 對比:
與@Configuration
的區別:@SpringBootApplication
是更高層次的封裝,包含自動配置和組件掃描,而@Configuration
僅標記配置類。
2. @Controller
- 詳細解析:
標記類為 Spring MVC 控制器,負責接收 HTTP 請求并返回視圖(如 JSP、Thymeleaf 模板)或通過@ResponseBody
返回數據。 - 注意事項:
需配合@RequestMapping
等注解映射請求路徑,單獨使用時返回的是視圖名稱,需依賴視圖解析器。 - 示例:
@Controller
@RequestMapping("/pages")
public class PageController {@GetMapping("/home") // 返回home.html視圖public String home() {return "home"; }
}
- 對比:
與@RestController
的區別:@RestController
?=?@Controller + @ResponseBody
,默認返回數據(如 JSON)而非視圖;@Controller
需顯式添加@ResponseBody
才返回數據。
3. @RestController
- 詳細解析:
專為 RESTful API 設計,方法返回值會直接作為 HTTP 響應體(默認序列化為 JSON),無需額外添加@ResponseBody
。 - 注意事項:
無法返回視圖(如 HTML 頁面),適合純數據接口開發。 - 示例:
@RestController
@RequestMapping("/api/users")
public class UserApiController {@GetMapping // 返回JSON數據public List<User> getUsers() {return Arrays.asList(new User(1, "Alice"));}
}
- 對比:
與@Controller
的區別:核心差異在返回值處理(視圖 vs 數據)。
4. @RequestMapping
- 詳細解析:
基礎請求映射注解,可用于類或方法,支持指定 URL 路徑、HTTP 方法(GET/POST 等)、請求參數、請求頭、媒體類型等。 - 注意事項:
Spring 4.3 + 推薦使用更具體的@GetMapping
、@PostMapping
等注解,避免重復指定method
屬性。 - 示例:
@RequestMapping(value = "/users", method = RequestMethod.GET, params = "type=admin")
public List<User> getAdminUsers() {// 僅處理帶type=admin參數的GET請求
}
- 對比:
與@GetMapping
等的區別:@RequestMapping
是通用注解,需顯式指定method
;而@GetMapping
等是簡化版,已固化 HTTP 方法。
5. @GetMapping
- 詳細解析:
@RequestMapping(method = RequestMethod.GET)
的快捷注解,專門處理 HTTP GET 請求,用于查詢資源。 - 注意事項:
適合讀取數據,冪等(多次請求結果一致)且不應修改資源狀態。 - 示例:
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {return userService.findById(id);
}
- 對比:
與@PostMapping
的區別:@GetMapping
用于查詢,@PostMapping
用于創建資源;@GetMapping
參數暴露在 URL 中,@PostMapping
參數在請求體中。
6. @PostMapping
- 詳細解析:
@RequestMapping(method = RequestMethod.POST)
的快捷注解,用于處理 HTTP POST 請求,適合創建新資源。 - 注意事項:
非冪等(多次請求可能創建多個資源),參數通常放在請求體中(如 JSON)。 - 示例:
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {User saved = userService.save(user);return ResponseEntity.status(201).body(saved);
}
- 對比:
與@PutMapping
的區別:@PostMapping
用于創建資源(URL 通常不包含 ID),@PutMapping
用于全量更新(URL 包含 ID)。
7. @PutMapping
- 詳細解析:
處理 HTTP PUT 請求,用于全量更新資源(需提供資源的完整信息)。 - 注意事項:
冪等(多次請求結果一致),通常要求客戶端提交資源的完整數據。 - 示例:
@PutMapping("/users/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {return userService.update(id, user); // 覆蓋整個用戶信息
}
- 對比:
與@PatchMapping
的區別:@PutMapping
用于全量更新,@PatchMapping
用于部分更新(僅提交需要修改的字段)。
8. @DeleteMapping
- 詳細解析:
處理 HTTP DELETE 請求,用于刪除資源。 - 注意事項:
冪等,刪除后再次請求應返回 404(資源不存在)。 - 示例:
@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {userService.delete(id);return ResponseEntity.noContent().build();
}
9. @PatchMapping
- 詳細解析:
處理 HTTP PATCH 請求,用于部分更新資源(僅修改指定字段)。 - 注意事項:
非冪等(如遞增計數器操作),請求體通常包含部分字段。 - 示例:
@PatchMapping("/users/{id}")
public User updateUserName(@PathVariable Long id, @RequestBody Map<String, String> updates) {return userService.updateField(id, "name", updates.get("name"));
}
- 對比:
與@PutMapping
的區別:如上述,核心是部分更新 vs 全量更新。
10. @PathVariable
- 詳細解析:
綁定 URL 路徑中的變量到方法參數,支持單個參數或復雜對象(需配合@ModelAttribute
)。 - 注意事項:
若參數名與 URL 占位符不一致,需通過value
指定(如@PathVariable("userId") Long id
)。 - 示例:
@GetMapping("/users/{userId}/orders/{orderId}")
public Order getOrder(@PathVariable("userId") Long uId, @PathVariable Long orderId
) {return orderService.findByUserAndOrder(uId, orderId);
}
- 對比:
與@RequestParam
的區別:@PathVariable
獲取 URL 路徑中的參數(如/users/1
中的 1),@RequestParam
獲取查詢參數(如/users?page=1
中的 page)。
11. @RequestParam
- 詳細解析:
綁定 HTTP 請求參數(查詢字符串或表單數據)到方法參數,支持設置是否必填、默認值等。 - 注意事項:
對于非基本類型參數(如自定義對象),需配合@ModelAttribute
使用。 - 示例:
@GetMapping("/users")
public List<User> getUsers(@RequestParam(required = false, defaultValue = "0") int page,@RequestParam(required = false, defaultValue = "10") int size
) {return userService.findPage(page, size);
}
- 對比:
與@RequestBody
的區別:@RequestParam
處理 URL 查詢參數或表單數據,@RequestBody
處理請求體中的數據(如 JSON)。
12. @RequestBody
- 詳細解析:
將 HTTP 請求體(如 JSON/XML)轉換為方法參數對象,依賴消息轉換器(如 Jackson)實現序列化。 - 注意事項:
僅支持 POST/PUT/PATCH 等包含請求體的方法,GET 請求無請求體,使用會報錯。 - 示例:
@PostMapping("/users")
public User createUser(@RequestBody @Valid User user) { // @Valid用于參數校驗return userService.save(user);
}
- 對比:
與@RequestParam
的區別:如上述,核心是請求體 vs 查詢參數。
13. @ResponseBody
- 詳細解析:
將方法返回值直接作為 HTTP 響應體(如 JSON),跳過視圖解析器。 - 注意事項:
@RestController
已包含此注解,無需重復添加。 - 示例:
@Controller
public class DataController {@GetMapping("/api/data")@ResponseBody // 返回JSON而非視圖public Map<String, String> getData() {return Collections.singletonMap("key", "value");}
}
14. @RequestHeader
- 詳細解析:
綁定 HTTP 請求頭信息到方法參數,如User-Agent
、Content-Type
等。 - 注意事項:
若請求頭不存在且未設置默認值,會拋出MissingRequestHeaderException
。 - 示例:
@GetMapping("/headers")
public String getHeaders(@RequestHeader("User-Agent") String userAgent,@RequestHeader(value = "Accept", defaultValue = "*/*") String accept
) {return "User-Agent: " + userAgent;
}
15. @CookieValue
- 詳細解析:
綁定請求中的 Cookie 值到方法參數,可獲取客戶端存儲的 Cookie 信息。 - 注意事項:
若 Cookie 不存在且required = true
,會拋出異常。 - 示例:
@GetMapping("/session")
public String getSessionId(@CookieValue("JSESSIONID") String sessionId) {return "Session ID: " + sessionId;
}
16. @Component
- 詳細解析:
通用組件注解,標記類為 Spring 管理的 Bean,由 Spring 自動掃描并實例化。 - 注意事項:
是@Service
、@Repository
、@Controller
的父注解,通常優先使用更具體的注解以提高代碼可讀性。 - 示例:
@Component // 通用組件,如工具類
public class DateUtils {public String format(Date date) {return new SimpleDateFormat("yyyy-MM-dd").format(date);}
}
- 對比:
與@Service
的區別:@Component
是通用注解,@Service
專為業務邏輯層設計,語義更明確。
17. @Service
- 詳細解析:
繼承自@Component
,標記類為業務邏輯層組件,Spring 會自動掃描并注入依賴。 - 注意事項:
事務管理(@Transactional
)通常應用于@Service
標注的類,確保業務操作的原子性。 - 示例:
@Service
public class UserServiceImpl implements UserService {private final UserRepository userRepository;@Autowiredpublic UserServiceImpl(UserRepository userRepository) {this.userRepository = userRepository;}
}
- 對比:
與@Repository
的區別:@Service
處理業務邏輯,@Repository
處理數據訪問;@Repository
會自動轉換數據庫異常為 Spring 統一的DataAccessException
。
18. @Repository
- 詳細解析:
繼承自@Component
,標記類為數據訪問層(DAO)組件,負責與數據庫交互。 - 注意事項:
Spring 會為其添加異常轉換器,將 JDBC/Hibernate 等原生異常轉換為DataAccessException
。 - 示例:
@Repository
public class UserRepositoryImpl implements UserRepository {@Overridepublic User findById(Long id) {// 數據庫查詢邏輯}
}
19. @Autowired
- 詳細解析:
自動注入 Spring 容器中的 Bean,支持構造函數、字段、setter 方法注入,默認按類型匹配。 - 注意事項:
- 構造函數注入是推薦方式(便于測試且強制依賴);
- 若存在多個同類型 Bean,需配合
@Qualifier
指定名稱; - Spring 4.3 + 對單個構造函數的類,可省略
@Autowired
。
- 示例:
@Service
public class OrderService {private final UserService userService;// 構造函數注入(推薦)@Autowiredpublic OrderService(UserService userService) {this.userService = userService;}
}
- 對比:
與@Resource
的區別:@Autowired
默認按類型注入,@Resource
默認按名稱注入;@Autowired
是 Spring 注解,@Resource
是 JSR-250 規范注解;@Autowired
可配合@Qualifier
指定名稱,@Resource
通過name
屬性指定。
20. @Qualifier
- 詳細解析:
與@Autowired
配合使用,當存在多個同類型 Bean 時,通過名稱指定要注入的 Bean。 - 注意事項:
value
屬性必須與目標 Bean 的名稱一致(默認是類名首字母小寫)。 - 示例:
@Service
public class PaymentService {@Autowired@Qualifier("alipayProcessor") // 指定注入alipayProcessorprivate PaymentProcessor processor;
}// 兩個同類型Bean
@Service("alipayProcessor")
public class AlipayProcessor implements PaymentProcessor { ... }@Service("wechatProcessor")
public class WechatProcessor implements PaymentProcessor { ... }
21. @Resource
- 詳細解析:
JSR-250 規范注解,用于依賴注入,默認按名稱匹配,名稱可通過name
屬性指定,若名稱不匹配則按類型匹配。 - 注意事項:
不支持required
屬性(默認必須存在,否則報錯),需確保容器中存在匹配的 Bean。 - 示例:
@Service
public class CartService {@Resource(name = "userRepository") // 按名稱注入private UserRepository userRepo;
}
22. @Configuration
- 詳細解析:
標記類為配置類,替代傳統 XML 配置文件,內部可通過@Bean
定義 Bean。 - 注意事項:
配置類本身也是 Bean,可被@Autowired
注入;@SpringBootApplication
已包含此注解。 - 示例:
@Configuration
public class AppConfig {@Bean // 定義Bean,名稱默認是方法名public RestTemplate restTemplate() {return new RestTemplate();}
}
- 對比:
與@Component
的區別:@Configuration
用于定義 Bean 配置,@Component
用于標記被管理的組件;@Configuration
中的@Bean
方法會被 CGLIB 代理,確保單例性。
23. @Bean
- 詳細解析:
用于@Configuration
類中,定義一個 Bean,Spring 會將方法返回值納入容器管理。 - 注意事項:
- 默認 Bean 名稱是方法名,可通過
name
屬性指定; - 支持
initMethod
和destroyMethod
指定初始化和銷毀方法。
- 示例:
@Configuration
public class DatabaseConfig {@Bean(name = "dataSource", destroyMethod = "close")public DataSource dataSource() {HikariConfig config = new HikariConfig();// 配置數據源return new HikariDataSource(config);}
}
24. @Value
- 詳細解析:
注入外部配置值(如application.properties
中的屬性)到字段或方法參數,支持 SpEL 表達式。 - 注意事項:
對于復雜配置,推薦使用@ConfigurationProperties
而非多個@Value
。 - 示例:
@Component
public class AppProperties {@Value("${app.name}") // 注入application.properties中的app.nameprivate String appName;@Value("#{T(java.lang.Math).random() * 100}") // SpEL表達式private double randomValue;
}
- 對比:
與@ConfigurationProperties
的區別:@Value
適合單個屬性注入,@ConfigurationProperties
適合批量綁定(如前綴相同的屬性);@ConfigurationProperties
支持類型轉換和校驗,@Value
需手動處理。
25. @ConfigurationProperties
- 詳細解析:
將外部配置(如application.yml
)批量綁定到 Bean 的字段,通常配合prefix
指定屬性前綴。 - 注意事項:
需要添加@Component
或在@Configuration
類中通過@EnableConfigurationProperties
啟用。 - 示例:
# application.yml
app:name: MyAppversion: 1.0.0server:port: 8080
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {private String name;private String version;private ServerConfig server; // 嵌套對象// getter/setterpublic static class ServerConfig {private int port;// getter/setter}
}
26. @Transactional
- 詳細解析:
聲明事務管理,確保方法內的操作要么全部成功,要么全部回滾,支持設置隔離級別、傳播行為等。 - 注意事項:
- 僅對
public
方法有效; - 自調用(同一類中方法調用)不會觸發事務,需通過 AOP 代理調用;
- 默認只回滾
RuntimeException
及其子類。
- 示例:
@Service
public class OrderService {@Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)public void createOrder(Order order) {// 數據庫操作1// 數據庫操作2}
}
27. @CrossOrigin
- 詳細解析:
解決跨域請求問題,允許指定來源、方法、 headers 等跨域參數。 - 注意事項:
可用于類或方法,方法級注解會覆蓋類級注解;生產環境需限制origins
避免安全風險。 - 示例:
@RestController
@CrossOrigin(origins = "https://example.com", methods = {GET, POST})
public class ApiController {@GetMapping("/data")public String getData() {return "cross-origin data";}
}
28. @Validated
- 詳細解析:
開啟方法參數校驗(基于 JSR-303/JSR-380 規范),配合@Valid
使用,支持分組校驗。 - 注意事項:
需添加依賴(如spring-boot-starter-validation
),校驗失敗會拋出MethodArgumentNotValidException
。 - 示例:
@RestController
@Validated // 類級別開啟校驗
public class UserController {@PostMapping("/users")public User createUser(@Valid @RequestBody User user) { // @Valid觸發校驗return userService.save(user);}
}// 實體類
public class User {@NotNull(message = "ID不能為空")private Long id;@Size(min = 2, max = 20, message = "姓名長度必須在2-20之間")private String name;
}
29. @Profile
- 詳細解析:
標記 Bean 或配置類僅在特定環境(如 dev/test/prod)下生效,通過spring.profiles.active
指定激活的環境。 - 注意事項:
可指定多個環境(如@Profile({"dev", "test"})
),!dev
表示排除 dev 環境。 - 示例:
@Configuration
public class DataSourceConfig {@Bean@Profile("dev") // 僅dev環境生效public DataSource devDataSource() {// 開發環境數據源}@Bean@Profile("prod") // 僅prod環境生效public DataSource prodDataSource() {// 生產環境數據源}
}
30. @Conditional
- 詳細解析:
基于條件判斷是否創建 Bean,需配合條件類(實現Condition
接口)使用,Spring Boot 提供了多種派生注解(如@ConditionalOnClass
、@ConditionalOnMissingBean
)。 - 注意事項:
條件判斷在 Bean 創建前執行,常用于自動配置邏輯。 - 示例:
@Configuration
public class RedisConfig {@Bean@ConditionalOnClass(RedisTemplate.class) // 當RedisTemplate類存在時創建Bean@ConditionalOnMissingBean // 當容器中不存在該類型Bean時創建public RedisTemplate<String, Object> redisTemplate() {return new RedisTemplate<>();}
}