1. 程式人生 > 其它 >spring boot註解(二)

spring boot註解(二)

  • JPA,在伺服器啟動的時候,jpa的啟動管理類會自動掃蕩繼承了JpaRepository的介面,然後新增到動態代理管理中,然後注入到spring的容器中。

    • @Entity當實體類名和表名相同,實體屬性和表字段相同時,會預設完成實體屬性和表字段的對映,當表名和實體類名不同,表字段和實體屬性不同時,需要使用@Table和@Column註解完成實體和表直接的對映

      檢視@Entity註解,發現其只有一個屬性name,表示其所對應的資料庫中的表名

    • @Table當實體類與其對映的資料庫表名不同名時需要使用 @Table註解說明,該標註與 @Entity 註解並列使用,置於實體類宣告語句之前,

      @Table註解的常用選項是 name,用於指明資料庫的表名 @Table註解還有兩個選項 catalog 和 schema 用於設定表所屬的資料庫目錄或模式,通常為資料庫名

    • @Column註釋定義了將成員屬性對映到關係表中的哪一列和該列的結構資訊

    • @Id註釋指定表的主鍵

  • 使用@SpringBootTest後,Spring將載入所有被管理的bean,基本等同於啟動了整個服務,此時便可以開始功能測試。

    由於web服務是最常見的服務,且我們對於web服務的測試有一些特殊的期望,所以@SpringBootTest註解中,給出了webEnvironment引數指定了web的environment,該引數的值一共有四個可選值:

    • MOCK:此值為預設值,該型別提供一個mock環境,可以和@AutoConfigureMockMvc或@AutoConfigureWebTestClient搭配使用,開啟Mock相關的功能。注意此時內嵌的服務(servlet容器)並沒有真正啟動,也不會監聽web服務埠。

    • RANDOM_PORT:啟動一個真實的web服務,監聽一個隨機埠。

    • DEFINED_PORT:啟動一個真實的web服務,監聽一個定義好的埠(從application.properties讀取)。

    • NONE:啟動一個非web的ApplicationContext,既不提供mock環境,也不提供真實的web服務。

注:如果當前服務的classpath中沒有包含web相關的依賴,spring將啟動一個非web的ApplicationContext,此時的webEnvironment就沒有什麼意義了。使用@Transactional 自動回滾測試資料

  • EnableCaching

    ,啟用快取註解

    • @Cacheable,快取中有就使用快取資料,引數如下:

      • value、cacheNames:兩個等同的引數(cacheNames為Spring 4新增,作為value的別名),用於指定快取儲存的集合名。由於Spring 4中新增了@CacheConfig,因此在Spring 3中原本必須有的value屬性,也成為非必需項了

      • key:快取物件儲存在Map集合中的key值,非必需,預設按照函式的所有引數組合作為key值,若自己配置需使用SpEL表示式,比如:

        • @Cacheable(key = "#p0"):使用函式第一個引數作為快取的key值

        • @Cacheable(value="user",key = "#user.id"):快取使用引數user作為value,user.id作為key

      • condition:快取物件的條件,非必需,也需使用SpEL表示式,只有滿足表示式條件的內容才會被快取,比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表示只有當第一個引數的長度小於3的時候才會被快取。

      • unless:另外一個快取條件引數,非必需,需使用SpEL表示式。它不同於condition引數的地方在於它的判斷時機,該條件是在函式被呼叫之後才做判斷的,所以它可以通過對result進行判斷。

      • keyGenerator:用於指定key生成器,非必需。若需要指定一個自定義的key生成器,我們需要去實現org.springframework.cache.interceptor.KeyGenerator介面,並使用該引數來指定。需要注意的是:該引數與key是互斥的

      • cacheManager:用於指定使用哪個快取管理器,非必需。只有當有多個時才需要使用

      • cacheResolver:用於指定使用那個快取解析器,非必需。需通過org.springframework.cache.interceptor.CacheResolver介面來實現自己的快取解析器,並用該引數指定。

    • @CacheEvict,清除快取

    • @CachePut,更新或新增快取

    • @CacheConfig,配置該類中會用到的一些共用的快取配置

  • 校驗controller引數有效性的註解

    • @NotBlank、@NotNull、@Max...等一系列註解,用在entity類的屬性上,校驗屬性有效性

    • @Valid,用在controller方法的引數上,校驗實體類屬性的有效性,使用BindingResult獲取驗證結果

    //entity
    public class User {

    /** 姓名 */
    @NotBlank(message = "請輸入名稱")
    @Length(message = "名稱不能超過個 {max} 字元", max = 10)
    public String name;
    }

    //controller
    @RestController
    public class UserController{
    @PostMapping("/add")
    public String add(@Valid User user,BindingResult bindingResult){
    if(bindingResult.hasErrors){
    return bindingResult.getAllErrors().get(0).getDefaultMessage();
    }
    return "add success"
    }
    }
  • @NoRepositoryBean:確保添加了該註解的 repository 介面不會在執行時被建立例項。 也就是說,使用了該註解的介面不會被單獨建立例項,只會作為其他介面的父介面而被使用。

    在伺服器啟動的時候,jpa的啟動管理類會自動掃蕩繼承了JpaRepository的介面,然後新增到動態代理管理中,然後注入到spring的容器中。

    即使用了該註解的介面不會被加入到spring的容器中,繼承該介面的子介面會被加入到spring的容器中。

  • @Autowired:預設根據型別注入,當同一個介面有多個實現類時,只使用@Autowired會報錯,因為spring不知道應該注入哪個實現類的bean,有下面兩種解決方法

  • @Qualifier:在@Autowired後面使用,根據bean的名稱注入

  • @Primary:在實現類加入容器時使用,告訴spring優先使用這個實現類的bean