久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Spring Boot 注解太多記不住?這 10 個核心注解讓你少寫 500 行配置(上)

     jacklopy 2025-09-03
    剛學 Spring Boot 時,總被各種注解搞得頭大 ——@Controller 和 @RestController 有啥區別?@Configuration 和 @Component 啥時候用?看著項目里密密麻麻的注解,光記名字就夠費勁了。
    其實 Spring Boot 的注解看似多,核心也就十幾個。今天先講 10 個最常用的,從啟動類到 Bean 管理,每個都帶著真實場景用法,看完就知道它們有多能省代碼。
    一、啟動與配置:3 個注解搞定項目初始化
    1. @SpringBootApplication:啟動類的 “萬能注解”
    每個 Spring Boot 項目都有個啟動類,上面必定帶著這個注解,它其實是三個注解的組合:
    • @Configuration:標記這是配置類
    • @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.properties 里的內容:

     

    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 必須能掃描到它們(比如在同一包或子包下)。
    5. @Autowired:自動注入依賴
    有了 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 { ... }

     

    6. @Resource:另一種注入方式
    和 @Autowired 類似,但可以按名稱注入,不用搭配 @Qualifier:

     

    @Service
    public class OrderService {
        // 按名稱注入wechatPayment
        @Resource(name = "wechatPayment")
        private PaymentService paymentService;
    }

     

    區別:@Autowired 默認按類型注入,@Resource 默認按名稱注入。
    7. @Scope:控制 Bean 的作用域
    默認情況下,Spring 的 Bean 是單例(整個應用只有一個實例),用 @Scope 改作用域:

     

    // 多例:每次獲取都創建新對象
    @Service
    @Scope("prototype")
    public class OrderService { ... }

     

    常用作用域:
    • singleton:單例(默認),整個應用一個實例
    • prototype:多例,每次注入或獲取都新建
    • request:每個 HTTP 請求一個實例(Web 環境)
    • session:每個會話一個實例(Web 環境)

    三、條件注解:按需創建 Bean
    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");
        }
    }

     

    9. @Profile:多環境切換的好幫手
    和 @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);
        }
    }

     

    10. @Value:讀取配置文件的值
    把配置文件里的參數注入到變量中,支持各種數據類型:

     

    @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 讓依賴注入自動完成
    • @Profile 輕松切換多環境,不用改代碼

    下一篇講 Web 開發相關的注解(@RestController、@RequestMapping 那些),關注不迷路~

    END

    你的關注將是我持續更新的動力
    ↓↓↓

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 国产精品不卡区一区二| 日日碰狠狠添天天爽五月婷| 永久黄网站色视频免费直播| 久久99精品久久久久久9| 少妇无套内谢免费视频| 亚洲欧美日韩综合在线丁香| 日日噜噜夜夜爽爽| 动漫AV纯肉无码AV电影网| 18禁网站免费无遮挡无码中文| 国产真实乱子伦精品视频| 免费A级毛片樱桃视频| 国产欧美日韩另类精彩视频| 在线涩涩免费观看国产精品| 亚洲欧美卡通另类丝袜美腿 | 女人18毛片水真多免费看| 中文乱码人妻系列一区二区| 亚洲理论在线A中文字幕| 边做饭边被躁欧美三级| 日韩中文字幕人妻精品| 18禁美女裸体爆乳无遮挡| 亚洲一区中文字幕人妻| 久久无码人妻一区二区三区午夜| 国产一区二区不卡自拍| 国产日产欧产精品精品| 国内少妇人妻偷人精品| 人妻少妇久久久久久97人妻| 精品国产高清中文字幕| 国产在线无码视频一区二区三区 | 精品国产成人A区在线观看| 国产成人最新三级在线视频| 女上男下激烈啪啪无遮挡| 亚洲日本成本人观看| 日本一区二区三区免费播放视频站| 久久午夜夜伦鲁鲁片免费无码影视| 亚洲国模精品一区二区| 夜夜高潮夜夜爽国产伦精品| 成人做受视频试看60秒| 国产精品二区中文字幕| 国模精品一区二区三区| 韩国V欧美V亚洲V日本V| 亚洲欧美自偷自拍视频图片|