SpringBoot常用標記注解(不全)

1.@SpringBootApplication :

Spring Boot應用標注在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用。

2.@SpringBootConfiguration:

Spring Boot的配置類;

標注在某個類上,表示這是一個Spring Boot的配置類;

3.@Configuration:

配置類上來標注這個注解;

配置類 ----- 配置文件;配置類也是容器中的一個組件;@Component

4.@EnableAutoConfiguration

開啟自動配置功能;

以前我們需要配置的東西,Spring Boot幫我們自動配置;

@EnableAutoConfiguration告訴SpringBoot開啟自動配置功能;這樣自動配置才能生效;

5.@AutoConfigurationPackage

自動配置包

6.@Import(AutoConfigurationPackages.Registrar.class):

Spring的底層注解@Import,給容器中導入一個組件;導入的組件由AutoConfigurationPackages.Registrar.class;

==將主配置類(@SpringBootApplication標注的類)的所在包及下面所有子包里面的所有組件掃描到Spring容器;==

7.@Import(EnableAutoConfigurationImportSelector.class);

給容器中導入組件?

EnableAutoConfigurationImportSelector:

導入哪些組件的選擇器;

將所有需要導入的組件以全類名的方式返回;這些組件就會被添加到容器中;

會給容器中導入非常多的自動配置類(xxxAutoConfiguration);就是給容器中導入這個場景需要的所有組件,并配置好這些組件;

有了自動配置類,免去了我們手動編寫配置注入功能組件等的工作;

8.SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);

==Spring Boot在啟動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作;==以前我們需要自己配置的東西,自動配置類都幫我們;

J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar;

9.@RequestMapping("/hello")

http://localhost:8080/hello:輸入該鏈接打印出標注類/方法的內容,8080是端口號,接收來自瀏覽器的hello請求

10.@RestController

這個類的所有方法返回的數據直接寫給瀏覽器,(如果是對象轉為json數據)

11.@ConfigurationProperties:

將配置文件中配置的每一個屬性的值,映射到這個組件中*

告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定;* prefix = "person":配置文件中哪個下面的所有屬性進行一一映射** 只有這個組件是容器中的組件,才能容器提供的@ConfigurationProperties功能;* @ConfigurationProperties(prefix = "person")默認從全局配置文件中獲取值;

12.@Value獲取值和@ConfigurationProperties獲取值比較

@CONFIGURATIONPROPERTIES @VALUE
功能 批量注入配置文件中的屬性 一個個指定
松散綁定(松散語法)('-n'='N') 支持 不支持
SpEL(表達式的計算) 不支持 支持
JSR303數據校驗(例如:增加Email檢驗) 支持 不支持
復雜類型封裝 支持 不支持

配置文件yml還是properties他們都能獲取到值;

如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value;

如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;

13.@Validated

配置在類上后可以使用JSR303數據校驗(例如:增加Email檢驗)

14.@controller 控制器(注入服務)

用于標注控制層,相當于struts中的action層

15.@service 服務(注入dao)

用于標注服務層,主要用來進行業務的邏輯處理

16.@repository(實現dao訪問)

用于標注數據訪問層,也可以說用于標注數據訪問組件,即DAO組件.

17.@component

(把普通pojo實例化到spring容器中,相當于配置文件中的 <bean id="" class=""/>)

例如可以放在@ConfigurationProperties上面使用

泛指各種組件,就是說當我們的類不屬于各種歸類的時候(不屬于@Controller、@Services等的時候),我們就可以使用@Component來標注這個類。

18.SpringBootTest

Spring Boot單元測試

可以在測試期間很方便的類似編碼一樣進行自動注入等

19.RunWith(SpringRunner.class)

單元測試用SpringRunner驅動器來跑

20.Test

放在方法上面可以不經過main方法對該方法進行測試

21、@PropertySource&@ImportResource&@Bean

@PropertySource

因為@ConfigurationProperties默認是從全局配置文件中獲取值,但若是將所以文件都配置到全局配置文件就太大了,但若是想要將無關的東西提取出來怎么辦呢?

@PropertySource可以用來讀取指定的配置文件或加載指定的配置文件;

“classpath:”類路徑下的意思

配置文件就是后綴名為“properties”和“yml”的

@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {
?
 //lastName必須是郵箱格式
 // @Email
 //@Value("${person.last-name}")
 private String lastName;
 //@Value("#{11*2}")
 private Integer age;
 //@Value("true")
 private Boolean boss;
?
}

@ImportResource

導入Spring的配置文件,讓配置文件里面的內容生效;

Spring Boot里面沒有Spring的配置文件,我們自己編寫的配置文件,也不能自動識別;

想讓Spring的配置文件生效,加載進來;@ImportResource標注在一個配置類上

@ImportResource(locations = {"classpath:beans.xml"})
導入Spring的配置文件讓其生效

22.@Configuration

指明當前類是一個配置類;就是來替代之前的的Spring配置文件

在配置文件中用<bean><bean/>標簽添加組件

23.@Bean

將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名

SpringBoot推薦給容器中添加組件的方式;推薦使用全注解的方式

1、配置類@Configuration------>Spring配置文件

2、使用@Bean給容器中添加組件

@Configuration
public class MyAppConfig {
?
 //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
 @Bean
 public HelloService helloService02(){
 System.out.println("配置類@Bean給容器中添加組件了...");
 return new HelloService();
 }
}

24.@Autowired

往容器中注入服務;在new對象跟自動注入對象同時使用時會空指針;

25.@Configuration

是告訴 Spring Boot 需要加載這個配置類。

26.@EnableSwagger2

是啟用 Swagger2,如果沒加的話自然而然也就看不到后面的驗證效果了。

27.@Api:

可設置對控制器的描述。

@Api 主要屬性

注解屬性 類型 描述
tags String[] 控制器標簽。
description String 控制器描述(該字段被申明為過期)。

28.@ApiOperatio

可設置對接口的描述。

@ApiOperation 主要屬性

注解屬性 類型 描述
value String 接口說明。
notes String 接口發布說明。
tags Stirng[] 標簽。
response Class<?> 接口返回類型。
httpMethod String 接口請求方式。

29.@ApiIgnore:

Swagger 文檔不會顯示擁有該注解的接口。

30.@ApiImplicitParams`:

用于描述接口的非對象參數集。

31.@ApiImplicitParam:

用于描述接口的非對象參數,一般與 @ApiImplicitParams 組合使用。

@ApiImplicitParam 主要屬性

注解屬性 描述
paramType 查詢參數類型,實際上就是參數放在那里。取值: path:以地址的形式提交數據,根據 id 查詢用戶的接口就是這種形式傳參。query:Query string 的方式傳參。header:以流的形式提交。form:以 Form 表單的形式提交。
dataType 參數的數據類型。取值: LongString
name 參數名字。
value 參數意義的描述。
required 是否必填。取值: true:必填參數。false:非必填參數。

Model 相關注解

32.@ApiModel: 可設置接口相關實體的描述。

33.@ApiModelProperty: 可設置實體屬性的相關描述。

@ApiModelProperty 主要屬性
注解屬性 類型 描述
value String 字段說明。
name String 重寫字段名稱。
dataType Stirng 重寫字段類型。
required boolean 是否必填。
example Stirng 舉例說明。
hidden boolean 是否在文檔中隱藏該字段。
allowEmptyValue boolean 是否允許為空。
allowableValues String 該字段允許的值,當我們 API 的某個參數為枚舉類型時,使用這個屬性就可以清楚地告訴 API 使用者該參數所能允許傳入的值。

在 Docket 上增加篩選。Docket 類提供了 apis()paths()兩 個方法來幫助我們在不同級別上過濾接口:

apis()`:這種方式我們可以通過指定包名的方式,讓 Swagger 只去某些包下面掃描。

paths()`:這種方式可以通過篩選 API 的 url 來進行過濾。

在集成 Swagger2 的章節中我們這兩個方法指定的都是掃描所有,沒有指定任何過濾條件。如果我們在我們修改之前定義的 Docket 對象的 apis() 方法和 paths() 方法為下面的內容,那么接口文檔將只會展示 /user/add 和 /user/find/{id} 兩個接口。

使用 Docket 配置接口篩選
.apis(RequestHandlerSelectors.basePackage("cn.itweknow.sbswagger.controller"))
.paths(Predicates.or(PathSelectors.ant("/user/add"),
PathSelectors.ant("/user/find/*")))
經過篩選過后的 Swagger 文檔界面
img

自定義響應消息

Swagger 允許我們通過 Docket 的 globalResponseMessage() 方法全局覆蓋 HTTP 方法的響應消息,但是首先我們得通過 Docket 的 useDefaultResponseMessages 方法告訴 Swagger 不使用默認的 HTTP 響應消息,假設我們現在需要覆蓋所有 GET 方法的 500 和 403 錯誤的響應消息,我們只需要在 SwaggerConfig.java 類中的 Docket Bean 下添加如下內容:

自定義響應消息
.useDefaultResponseMessages(false)
.globalResponseMessage(RequestMethod.GET, newArrayList(
new ResponseMessageBuilder()
 .code(500) 
 .message("服務器發生異常")
 .responseModel(new ModelRef("Error"))
 .build(),
 new ResponseMessageBuilder()
 .code(403)
 .message("資源不可用")
 .build()
));

添加如上面的代碼后,如下圖所示,您會發現在 SwaggerUI 頁面展示的所有 GET 類型請求的 403 以及 500 錯誤的響應消息都變成了我們自定義的內容。

自定義響應消息
img

34.Hibernate Validator常用注解

注解 釋義
@Null 必須為null
@NotNull 不能為null
@AssertTrue 必須為true
@AssertFalse 必須為false
@Min(value,message=) 必須為數字,其值大于或等于指定的最小值
@Max(value,message=) 必須為數字,其值小于或等于指定的最大值
@DecimalMin(value,message=) 必須為數字,其值大于或等于指定的最小值
@DecimalMax(value,message=) 必須為數字,其值小于或等于指定的最大值
@Size(max, min,message=) 集合的長度
@Digits(integer, fraction,message=) 必須為數字,其值必須再可接受的范圍內
@Past 必須是過去的日期
@Future 必須是將來的日期
@Pattern(value,message=) 必須符合正則表達式
@Email 必須是郵箱格式
@Length(min=, max=,message=) 長度范圍
@NotEmpty 不能為null,長度大于0
@Range(min=, max=,message=) 元素的大小范圍
@NotBlank 不能為null,字符串長度大于0(限字符串)
@URL(protocol=, host=, port=, regexp=, flags=,message=) 被注釋的字符串必須是一個有效的url
@CreditCardNumber 被注釋的字符串必須通過Luhn校驗算法,銀行卡,信用卡等號碼一般都用Luhn 計算合法性
@ScriptAssert (lang=, script=, alias=,message=) 要有Java Scripting API 即JSR 223 (“Scripting for the JavaTM Platform”)的實現
@SafeHtml(whitelistType=,additionalTags=,message=) classpath中要有jsoup包

message="錯誤提示"

主要區分下@NotNull @NotEmpty @NotBlank 3個注解的區別:

  • @NotNull 任何對象的value不能為null

  • @NotEmpty 集合對象的元素不為0,即集合不為空,也可以用于字符串不為null

  • @NotBlank 只能用于字符串不為null,并且字符串trim()以后length要大于0

注意必須先進行為null判斷,否則其他注解有的不會生效。 比如username加了@Length而不加@NotNull注解,當沒有輸入username,那么@Length判斷將不會生效,判斷為null的有@NotNull、@NotEmpty以及@NotBlank

public class User {
 @NotBlank(message = "名稱不能為空")
 private String name;
?
@Range(min = 1, max = 120, message = "年齡必須為1-120歲")
private Integer age;
?
@NotBlank(message = "描述不能為空")
private String description;
?
@NotNull
@Length(min = 6, max = 18, message = "用戶名長度必須為6-18位")
private String username;
?
@NotNull
@Length(min = 6, max = 18, message = "密碼長度必須為6-18位")
private String password;
?
/** get、set方法 */
?
}

@Valid用在參數上,表示對該參數進行校驗。 如果對參數校驗發現有誤,會將錯誤注入到BindingResult中 我們這里將錯誤進行打印,也可以直接拋出異常

接口入參 需要添加 @Valid 注解,才會對入參進行參數校驗。

@RestController
public class UserController {
?
@GetMapping("/insert")
@ResponseBody
public User insertUser(@Valid User user, BindingResult result) {
 if (result.hasErrors()) {
 for (ObjectError error : result.getAllErrors()) {
 System.err.println(error.getDefaultMessage());
 }
 }
 return user;
}
?
}

35.配置文件占位符

1、隨機數
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2、占位符獲取之前配置的值,如果沒有可以是用“:”指定默認值
person.last-name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
#如果沒有找到person.hello,則返回默認值hello
person.dog.name=${person.hello:hello}_dog
person.dog.age=15

36.@EnableAuthorizationServer

開啟認證服務,在創建登錄授權接口/類時可以用

37.**@EnableGlobalMethodSecurity

Spring Security默認是禁用注解的,要想開啟注解,需要在繼承WebSecurityConfigurerAdapter的類上加@EnableGlobalMethodSecurity注解,來判斷用戶對某個控制層的方法是否具有訪問權限

1、@EnableGlobalMethodSecurity(securedEnabled=true) 開啟@Secured 注解過濾權限

2、@EnableGlobalMethodSecurity(jsr250Enabled=true)

開啟@RolesAllowed 注解過濾權限

3、@EnableGlobalMethodSecurity(prePostEnabled=true) 使用表達式時間方法級別的安全性 4個注解可用

  • @PreAuthorize 在方法調用之前,基于表達式的計算結果來限制對方法的訪問

  • @PostAuthorize 允許方法調用,但是如果表達式計算結果為false,將拋出一個安全性異常

  • @PostFilter 允許方法調用,但必須按照表達式來過濾方法的結果

  • @PreFilter 允許方法調用,但必須在進入方法之前過濾輸入值

38.@EnableWebSecurity

1:加載了WebSecurityConfiguration配置類, 配置安全認證策略。

2: 加載了AuthenticationConfiguration, 配置了認證信息。

39.@PathVariable

獲取參數。

40.自動配置中使用的條件化注解

@ConditionalOnBean:配置了某個特定Bean
@ConditionalOnMissingBean:沒有配置特定的Bean
@ConditionalOnClass:Classpath里有指定的類
@ConditionalOnMissingClass:Classpath里缺少指定的類
@ConditionalOnExpression:給定的Spring Expression Language(SpEL)表達式計算結果為 true @ConditionalOnJava:Java的版本匹配特定值或者一個范圍值
@ConditionalOnJndi:參數中給定的JNDI位置必須存在一個,如果沒有給參數,則要有JNDI InitialContext @ConditionalOnProperty:指定的配置屬性要有一個明確的值
@ConditionalOnResource:Classpath里有指定的資源
@ConditionalOnWebApplication:這是一個Web應用程序
@ConditionalOnNotWebApplication:這不是一個Web應用程序

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375