最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring & Spring Boot 常用注解整理收藏

 更新時間:2025年05月19日 10:34:46   作者:程序員buddha2080  
注解就像代碼里的便利貼,用來告訴 Spring 框架:這個類/方法/變量有什么特殊用途,本文分步驟給大家介紹Spring & Spring Boot 常用注解整理,感興趣的朋友一起看看吧

先理解核心概念:什么是注解(Annotation)?

類比:注解就像代碼里的“便利貼”,用來告訴 Spring 框架:“這個類/方法/變量有什么特殊用途”。
作用:簡化配置,讓框架自動幫你處理一些事情(比如創(chuàng)建對象、管理依賴、處理請求等)。

第一部分:IOC(控制反轉(zhuǎn))和 DI(依賴注入)

核心思想:把對象的創(chuàng)建和管理交給 Spring 容器,而不是自己手動 new 對象。

注解說明示例
@Component通用組件標記,被掃描的類會納入 Spring 容器管理@Component public class MyComponent { ... }
@Service標記服務(wù)層組件,屬于@Component的特化形式@Service public class UserService { ... }
@Repository標記數(shù)據(jù)訪問層組件(DAO層),具有數(shù)據(jù)庫異常轉(zhuǎn)譯功能@Repository public class UserDao { ... }
@Controller標記控制器組件(Web層)@Controller public class UserController { ... }
@Autowired自動注入依賴,默認按類型匹配@Autowired private UserService userService;
@Qualifier按名稱指定注入的 Bean@Autowired @Qualifier("userServiceImplA") private UserService service;
@Primary標記首選的 Bean(存在多個同類型 Bean 時優(yōu)先注入)@Bean @Primary public DataSource primaryDataSource() { ... }
@Scope定義 Bean 的作用域(singleton/prototype等)@Component @Scope("prototype") public class MyPrototypeBean { ... }

1. @Component

作用:告訴 Spring:“這個類交給你管理,我需要的時候找你要實例”。
代碼示例

@Component  // 貼上這個標簽,Spring 就會自動創(chuàng)建 MyComponent 的實例(Bean)
public class MyComponent {
    public void hello() {
        System.out.println("Hello from MyComponent!");
    }
}

使用場景:通用的工具類、第三方庫的適配類等。

2. @Service, @Repository, @Controller

本質(zhì):它們都是 @Component 的“馬甲”,用途相同,只是名字不同,為了代碼可讀性。

  • @Service:標記業(yè)務(wù)邏輯層(如處理用戶注冊、訂單支付)。
  • @Repository:標記數(shù)據(jù)訪問層(如操作數(shù)據(jù)庫)。
  • @Controller:標記 Web 控制器(處理 HTTP 請求)。

代碼對比

@Service
public class UserService {  // 業(yè)務(wù)邏輯層
    public void registerUser(String name) { ... }
}
@Repository
public class UserDao {  // 數(shù)據(jù)訪問層
    public User findUserById(Long id) { ... }
}
@Controller
public class UserController {  // 處理 HTTP 請求
    @GetMapping("/users")
    public String listUsers() { ... }
}

3. @Autowired

作用:讓 Spring 自動幫你“注入”依賴的 Bean(類似找人借東西,不用自己造)。
代碼示例

@Service
public class UserService {
    @Autowired  // Spring 會自動找一個 UserDao 的 Bean 注入到這里
    private UserDao userDao;
    public User findUser(Long id) {
        return userDao.findUserById(id);  // 直接使用 userDao,不需要 new UserDao()
    }
}

原理:Spring 會在容器中查找匹配類型的 Bean,自動賦值給 userDao。

4. @Qualifier

問題場景:如果有多個同類型的 Bean,Spring 不知道注入哪一個。
解決:用 @Qualifier 指定 Bean 的名字。

代碼示例

// 定義兩個數(shù)據(jù)源
@Component("mysqlDataSource")
public class MySQLDataSource implements DataSource { ... }
@Component("postgresDataSource")
public class PostgresDataSource implements DataSource { ... }
// 使用時指定名稱
@Service
public class DataService {
    @Autowired
    @Qualifier("mysqlDataSource")  // 明確告訴 Spring 注入名為 "mysqlDataSource" 的 Bean
    private DataSource dataSource;
}

第二部分:Spring MVC(處理 HTTP 請求)

注解說明示例
@RestController組合注解(@Controller + @ResponseBody),用于 REST API@RestController public class ApiController { ... }
@RequestMapping映射 HTTP 請求路徑,可指定 method@RequestMapping(value="/users", method=RequestMethod.GET)
@GetMapping簡化 GET 請求映射(同理有@PostMapping、@PutMapping等)@GetMapping("/{id}") public User getUser(@PathVariable Long id)
@PathVariable綁定 URL 路徑中的變量@GetMapping("/users/{id}") public User getById(@PathVariable Long id)
@RequestParam綁定請求參數(shù)(支持默認值、是否必傳等)@GetMapping("/search") public List<User> search(@RequestParam(defaultValue = "") String keyword)
@RequestBody將請求體內(nèi)容反序列化為 Java 對象(如 JSON)@PostMapping public User create(@RequestBody User user) { ... }
@ResponseBody將方法返回值序列化為響應(yīng)體(如 JSON)已內(nèi)置在@RestController
@ExceptionHandler處理控制器內(nèi)的特定異常@ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleException() { ... }
@CrossOrigin允許跨域請求@CrossOrigin(origins = "http://example.com")

1. @RestController vs @Controller

  • @Controller:傳統(tǒng) MVC 控制器,返回視圖(如 JSP 頁面)。
  • @RestController:專門用于 REST API,直接返回 JSON 數(shù)據(jù)(內(nèi)部包含 @ResponseBody)。

代碼對比

// 傳統(tǒng) Controller(返回視圖名,由模板引擎渲染)
@Controller
public class OldController {
    @GetMapping("/hello")
    public String hello() {
        return "hello-page";  // 對應(yīng) src/main/resources/templates/hello-page.html
    }
}
// REST Controller(返回 JSON)
@RestController
public class ApiController {
    @GetMapping("/user")
    public User getUser() {
        return new User(1, "Alice");  // 自動轉(zhuǎn)換為 JSON:{ "id": 1, "name": "Alice" }
    }
}

2. @GetMapping / @PostMapping

作用:簡化 HTTP 請求映射,替代 @RequestMapping(method=RequestMethod.GET)。

代碼示例

@RestController
public class UserController {
    // 處理 GET 請求:http://localhost:8080/users
    @GetMapping("/users")
    public List<User> listUsers() {
        return userService.getAllUsers();
    }
    // 處理 POST 請求:http://localhost:8080/users
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {  // @RequestBody 表示接收 JSON 數(shù)據(jù)
        return userService.saveUser(user);
    }
}

3. @PathVariable 和 @RequestParam

  • @PathVariable:從 URL 路徑中獲取變量(如 /users/123 中的 123)。
  • @RequestParam:從 URL 參數(shù)中獲取值(如 /search?keyword=java 中的 keyword)。

代碼示例

@GetMapping("/users/{id}")  // URL 模板:{id} 是占位符
public User getUserById(@PathVariable Long id) {  // 獲取路徑中的 id
    return userService.findById(id);
}
@GetMapping("/search")
public List<User> searchUsers(@RequestParam String keyword) {  // 獲取參數(shù) ?keyword=xxx
    return userService.search(keyword);
}

第三部分:配置相關(guān)注解

注解說明示例
@Configuration標記類為配置類(替代 XML 配置文件)@Configuration public class AppConfig { ... }
@Bean聲明方法返回的對象作為 Bean 加入容器@Bean public DataSource dataSource() { return new HikariDataSource(); }
@Value注入配置文件中的值@Value("${db.url}") private String dbUrl;
@PropertySource加載指定 properties 文件@Configuration @PropertySource("classpath:custom.properties")
@ConfigurationProperties批量綁定配置文件屬性到對象(需配合@EnableConfigurationProperties@Component @ConfigurationProperties(prefix="app") public class AppConfig { private String name; ... }
@Profile指定 Bean 生效的環(huán)境@Bean @Profile("dev") public DataSource devDataSource() { ... }

1. @Configuration 和 @Bean

作用:替代 XML 配置文件,手動定義 Bean。

代碼示例

@Configuration  // 告訴 Spring:“這是一個配置類”
public class AppConfig {
    @Bean  // 這個方法返回的對象會被 Spring 管理
    public DataSource dataSource() {
        return new HikariDataSource();  // 手動創(chuàng)建一個數(shù)據(jù)源
    }
}

2. @Value

作用:從配置文件(如 application.properties)中讀取值。

示例

# application.properties
app.name=My Awesome App
database.url=jdbc:mysql://localhost:3306/mydb
@Component
public class AppConfig {
    @Value("${app.name}")  // 注入 app.name 的值
    private String appName;
    @Value("${database.url}")  // 注入數(shù)據(jù)庫 URL
    private String dbUrl;
}

第四部分:Spring Boot 核心注解

注解說明示例
@SpringBootApplication啟動類注解(包含@Configuration+@EnableAutoConfiguration+@ComponentScan@SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } }
@EnableAutoConfiguration啟用自動配置機制(通常已包含在@SpringBootApplication中)顯式使用:@SpringBootApplication @EnableAutoConfiguration
@ConditionalOnProperty根據(jù)配置屬性條件化創(chuàng)建 Bean@Bean @ConditionalOnProperty(name="feature.enabled", havingValue="true") public FeatureBean featureBean() { ... }

作用:標記啟動類,包含三個核心功能:

  • @Configuration:這是一個配置類。
  • @EnableAutoConfiguration:開啟自動配置(如自動配置數(shù)據(jù)庫連接池)。
  • @ComponentScan:自動掃描當前包及子包下的組件(@Component, @Service 等)。

代碼示例

@SpringBootApplication  // 一切從這里開始
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);  // 啟動 Spring Boot 應(yīng)用
    }
}

第五部分:數(shù)據(jù)庫和事務(wù)

注解說明示例
@Transactional聲明事務(wù)管理(可加在類或方法上)@Transactional public void updateUser(User user) { ... }
@EntityJPA 實體類標記@Entity public class User { @Id private Long id; ... }
@JpaRepositorySpring Data JPA 的倉庫接口public interface UserRepository extends JpaRepository<User, Long> { ... }

1. @Entity 和 @Id

作用:標記 JPA 實體類(對應(yīng)數(shù)據(jù)庫表)和主鍵字段。

代碼示例

@Entity  // 告訴 Spring:“這是一個數(shù)據(jù)庫表對應(yīng)的實體類”
public class User {
    @Id  // 標記為主鍵
    private Long id;
    private String name;
    // 省略 getter/setter
}

2. @Transactional

作用:聲明事務(wù),確保方法內(nèi)的數(shù)據(jù)庫操作要么全部成功,要么全部回滾。

代碼示例

@Service
public class OrderService {
    @Autowired
    private OrderRepository orderRepository;
    @Transactional  // 開啟事務(wù)
    public void placeOrder(Order order) {
        orderRepository.save(order);  // 保存訂單
        // 如果這里拋出異常(如庫存不足),整個事務(wù)會回滾,訂單不會被保存
    }
}

第六部分:AOP(面向切面編程)

核心思想:在不修改原有代碼的情況下,統(tǒng)一處理日志、權(quán)限、事務(wù)等橫切關(guān)注點。

注解說明示例
@Aspect聲明切面類@Aspect @Component public class LoggingAspect { ... }
@Pointcut定義切入點表達式@Pointcut("execution(* com.example.service.*.*(..))") public void serviceMethods() {}
@Before前置通知@Before("serviceMethods()") public void logBefore(JoinPoint jp) { ... }

1. @Aspect 和 @Before

代碼示例

@Aspect   // 告訴 Spring:“這是一個切面類”
@Component
public class LoggingAspect {
    // 定義切入點:攔截所有 Service 層的方法
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceMethods() {}
    // 前置通知:在方法執(zhí)行前打印日志
    @Before("serviceMethods()")
    public void logBefore(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("準備執(zhí)行方法:" + methodName);
    }
}

總結(jié):注解的核心作用

場景常用注解類比解釋
管理對象@Component, @Service告訴 Spring:“這個類歸你管!”
依賴注入@Autowired, @Qualifier告訴 Spring:“我需要這個,幫我拿!”
處理 HTTP 請求@RestController, @GetMapping告訴 Spring:“這個方法是處理某個 URL 的!”
讀取配置@Value, @ConfigurationProperties告訴 Spring:“把配置文件的值給我!”
事務(wù)管理@Transactional告訴 Spring:“這個方法要保證事務(wù)!”

到此這篇關(guān)于Spring &amp; Spring Boot 常用注解整理的文章就介紹到這了,更多相關(guān)Spring Boot 常用注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • checkpoint 機制具體實現(xiàn)示例詳解

    checkpoint 機制具體實現(xiàn)示例詳解

    這篇文章主要為大家介紹了checkpoint 機制具體實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • @Transactional跟@DS動態(tài)數(shù)據(jù)源注解沖突的解決

    @Transactional跟@DS動態(tài)數(shù)據(jù)源注解沖突的解決

    這篇文章主要介紹了@Transactional跟@DS動態(tài)數(shù)據(jù)源注解沖突的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Event?Sourcing事件溯源模式優(yōu)化業(yè)務(wù)系統(tǒng)

    Event?Sourcing事件溯源模式優(yōu)化業(yè)務(wù)系統(tǒng)

    這篇文章主要為大家介紹了Event?Sourcing事件溯源模式優(yōu)化業(yè)務(wù)系統(tǒng)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 解決springboot MultipartFile文件上傳遇到的問題

    解決springboot MultipartFile文件上傳遇到的問題

    本文給大家?guī)砹私鉀Qspringboot MultipartFile文件上傳遇到的問題,解決方法超簡單,感興趣的朋友參考下本文
    2018-08-08
  • Springboot使用@RefreshScope注解實現(xiàn)配置文件的動態(tài)加載

    Springboot使用@RefreshScope注解實現(xiàn)配置文件的動態(tài)加載

    本文主要介紹了Springboot使用@RefreshScope注解實現(xiàn)配置文件的動態(tài)加載,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • java 域?qū)ο蠊蚕頂?shù)據(jù)的實現(xiàn)

    java 域?qū)ο蠊蚕頂?shù)據(jù)的實現(xiàn)

    本文主要介紹了java 域?qū)ο蠊蚕頂?shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Java實現(xiàn)文本查重的方法詳解

    Java實現(xiàn)文本查重的方法詳解

    Ansj 是一個開源的 Java 中文分詞工具,基于中科院的 ictclas 中文分詞算法,采用隱馬爾科夫模型(HMM),比其他常用的開源分詞工具(如 MMseg4j)的分詞準確率更高,下面我們就來使用它實現(xiàn)文本查重功能吧
    2024-04-04
  • IDEA導入Eclipse項目全過程

    IDEA導入Eclipse項目全過程

    這篇文章介紹了如何將Eclipse項目導入到IntelliJ IDEA,并詳細步驟如下:新建一個文件夾,用IntelliJ IDEA打開,將項目導入,等待編譯完成,配置項目環(huán)境和結(jié)構(gòu),注意文件夾名稱可能不同,配置Tomcat,重新編譯項目并啟動
    2025-11-11
  • IDEA強制清除Maven緩存的方法示例

    IDEA強制清除Maven緩存的方法示例

    這篇文章主要介紹了IDEA強制清除Maven緩存的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Java多線程 原子性操作類的使用

    Java多線程 原子性操作類的使用

    這篇文章主要介紹了Java多線程 原子性操作類的使用,在java5以后,我們接觸到了線程原子性操作,也就是在修改時我們只需要保證它的那個瞬間是安全的即可,經(jīng)過相應(yīng)的包裝后可以再處理對象的并發(fā)修改,本文總結(jié)一下Atomic系列的類的使用方法,下面一起進入文章了解詳細內(nèi)容
    2021-10-10

最新評論

神木县| 五寨县| 炎陵县| 蓝山县| 宝丰县| 小金县| 密云县| 进贤县| 娄底市| 天津市| 永年县| 嵊州市| 南京市| 久治县| 隆尧县| 囊谦县| 车险| 阿荣旗| 姚安县| 建水县| 泉州市| 延安市| 洛阳市| 汝州市| 正安县| 聂拉木县| 芷江| 北流市| 正定县| 获嘉县| 策勒县| 乌拉特中旗| 积石山| 无极县| 浙江省| 阿图什市| 北海市| 水富县| 晋州市| 永寿县| 铜鼓县|