剛學 Spring Boot 時,總被各種注解搞得頭大 ——@Controller 和 @RestController 有啥區別?@Configuration 和 @Component 啥時候用?看著項目里密密麻麻的注解,光記名字就夠費勁了。其實 Spring Boot 的注解看似多,核心也就十幾個。今天先講 10 個最常用的,從啟動類到 Bean 管理,每個都帶著真實場景用法,看完就知道它們有多能省代碼。1. @SpringBootApplication:啟動類的 “萬能注解”每個 Spring Boot 項目都有個啟動類,上面必定帶著這個注解,它其實是三個注解的組合:- @ComponentScan:自動掃描當前包及子包的 Bean
- @EnableAutoConfiguration:開啟自動配置(Spring Boot 的核心黑科技)
// 最簡單的啟動類,一行注解搞定 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
坑點提醒:如果想排除某些自動配置(比如不想用默認的數據源配置),可以用 exclude 參數: @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class DemoApplication { ... }
2. @Configuration + @Bean:替代 XML 配置的利器以前用 Spring 時,得寫一堆 XML 配置定義 Bean,現在用這兩個注解完全能替代:- @Configuration:告訴 Spring 這是個配置類
- @Bean:把方法返回值注冊成 Spring 容器里的 Bean
@Configuration public class MyConfig { // 定義一個RedisTemplate的Bean,全局可用 @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); // 設置序列化方式等配置 return template; } // 定義一個自定義工具類的Bean @Bean public DateUtils dateUtils() { return new DateUtils(); } }
小技巧:@Bean 默認用方法名作為 Bean 的名稱,也可以手動指定:@Bean (name = "myRedisTemplate")3. @PropertySource:加載自定義配置文件Spring Boot 默認讀 application.properties,但想拆分配置(比如單獨放數據庫配置),用這個注解: // 加載classpath下的db.properties文件 @Configuration @PropertySource("classpath:db.properties") public class DbConfig { // 讀取配置文件里的屬性 @Value("${db.url}") private String url; @Value("${db.username}") private String username; // ... }
db.url=jdbc:mysql://localhost:3306/test db.username=root db.password=123456
二、Bean 管理:4 個注解讓 Spring 自動管理對象4. @Component + 衍生注解:自動注冊 Bean不用手動在 @Configuration 里寫 @Bean,加個注解讓 Spring 自動掃描注冊:- @Component:通用注解,標記一個類為 Bean
- @Service:用于業務層(Service),語義更清晰
- @Repository:用于數據訪問層(DAO),會自動處理異常
- @Controller:用于控制層(MVC 中的 C)
// 服務層用@Service @Service public class UserService { // 業務邏輯... }
// 數據訪問層用@Repository @Repository public class UserDao { // 數據庫操作... }
// 控制層用@Controller @Controller public class UserController { // 接收請求... }
注意:這些注解要生效,啟動類的 @SpringBootApplication 必須能掃描到它們(比如在同一包或子包下)。有了 Bean 之后,不用手動 new 對象,讓 Spring 自動把需要的 Bean 塞進來: @Service public class UserService { // 自動注入UserDao的Bean @Autowired private UserDao userDao; public User getUserById(Long id) { // 直接用,不用自己創建userDao return userDao.findById(id); } }
進階用法:如果一個接口有多個實現類,用 @Qualifier 指定名稱: @Service public class OrderService { // 注入名稱為alipayPayment的Bean @Autowired @Qualifier("alipayPayment") private PaymentService paymentService; }
// 實現類1 @Service("alipayPayment") public class AlipayPayment implements PaymentService { ... }
// 實現類2 @Service("wechatPayment") public class WechatPayment implements PaymentService { ... }
和 @Autowired 類似,但可以按名稱注入,不用搭配 @Qualifier: @Service public class OrderService { // 按名稱注入wechatPayment @Resource(name = "wechatPayment") private PaymentService paymentService; }
區別:@Autowired 默認按類型注入,@Resource 默認按名稱注入。默認情況下,Spring 的 Bean 是單例(整個應用只有一個實例),用 @Scope 改作用域: // 多例:每次獲取都創建新對象 @Service @Scope("prototype") public class OrderService { ... }
- singleton:單例(默認),整個應用一個實例
- request:每個 HTTP 請求一個實例(Web 環境)
8. @Conditional:滿足條件才注冊 Bean根據條件動態決定是否創建 Bean,比如只在 Windows 系統才注冊某個 Bean: @Configuration public class SystemConfig { // 當WindowsCondition返回true時,才創建這個Bean @Bean @Conditional(WindowsCondition.class) public SystemService windowsService() { return new WindowsService(); } // 當LinuxCondition返回true時,才創建這個Bean @Bean @Conditional(LinuxCondition.class) public SystemService linuxService() { return new LinuxService(); } }
// 自定義條件:實現Condition接口 public class WindowsCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // 判斷操作系統是否為Windows return context.getEnvironment().getProperty("os.name").contains("Windows"); } }
和 @Conditional 類似,但專門用于環境切換(開發、測試、生產): @Configuration public class DataSourceConfig { // 開發環境的數據源 @Bean @Profile("dev") public DataSource devDataSource() { return new HikariDataSource(devConfig); } // 生產環境的數據源 @Bean @Profile("prod") public DataSource prodDataSource() { return new HikariDataSource(prodConfig); } }
把配置文件里的參數注入到變量中,支持各種數據類型: @Component public class AppConfig { // 注入字符串 @Value("${app.name}") private String appName; // 注入數字 @Value("${app.maxSize}") private int maxSize; // 注入布爾值 @Value("${app.enabled:true}")// 冒號后是默認值 private boolean enabled; // 注入系統屬性 @Value("${os.name}") private String osName; }
application.properties 里的配置: app.name=我的應用 app.maxSize=100 # app.enabled沒配置,用默認值true
以前用純 Spring 時,光是配置 Bean 就要寫一堆 XML,現在用這些注解:- 一個 @SpringBootApplication 替代 N 行 XML 配置
- @Service、@Autowired 讓依賴注入自動完成
下一篇講 Web 開發相關的注解(@RestController、@RequestMapping 那些),關注不迷路~
|