Java常用注解

Java常用注解


Controller常用注解

@Controller

注解在類上。
定義了一個控制器類,并檢測該方法是否使用了@RequestMapping注解處理Http請求。

@ResponseBody

注解在類或方法上。
在實際操作中我們只需要在Controller層使用@RequestBody注解就可以將對象進行反序列化;
而若需要對Controller的方法進行序列化,我們需要在返回值上使用@ResponseBody;
也可以將@ResponseBody注解在Controller類上,這樣可以將這個類中所有的方法序列化。

@RestController

注解在類上。?
1.@RestController 注解相當于 @ResponseBody + @Controller
2.@RestController為開發提供了方便,在提供json接口時需要的配置操作再也不需要自己配置了
3.@RestController注解時,返回的是內容實例?

@RequestMapping

注解在類或方法上。
映射請求路徑。

@GetMapping / @PostMapping

注解在方法上。
處理請求方法的GET/POST類型。

@RequestParam

注解在方法上。
將請求參數綁定到控制器的方法參數上。

@ControllerAdvice

注解在類上。
https://www.cnblogs.com/lenve/p/10748453.html
增強 Controller,可以實現三個方面的功能:

  • 全局異常處理
    在該類中,可以定義多個方法,不同的方法處理不同的異常,
    @ExceptionHandler(Exception.class) 注解用來指明異常的處理類型
  • 全局數據綁定
    使用 @ModelAttribute 注解標記該方法的返回數據是一個全局數據,
    默認情況下,這個全局數據的 key 就是返回的變量名,value 就是方法返回值,
    當然開發者可以通過 @ModelAttribute 注解的 name 屬性去重新指定 key。
    定義完成后,在任何一個Controller 的接口中,都可以獲取到這里定義的數據
  • 全局數據預處理
    1.給接口中的變量取別名
    2.進行請求數據預處理
    @InitBinder("b") 注解表示該方法用來處理和Book和相關的參數,在方法中,給參數添加一個 b 前綴,即請求參數要有b前綴.
    3.發送請求

Dao常用注解

@Mapper

注解在類上
?1:為了把mapper這個DAO交給Spring管理?
http://412887952-qq-com.iteye.com/blog/2392672
2:為了不再寫mapper映射文件
?https://blog.csdn.net/phenomenonstell/article/details/79033144
3:為了給mapper接口 自動根據一個添加@Mapper注解的接口生成一個實現類?http://www.tianshouzhi.com/api/tutorials/mapstruct/292

@Param

注解在變量上,@Param 是MyBatis所提供的(org.apache.ibatis.annotations.Param),作為Dao層的注解,作用是用于傳遞參數,從而可以與SQL中的的字段名相對應,一般在2=<參數數<=5時使用最佳。

@Primary

注解在方法上
自動裝配時當出現多個Bean候選者時,被注解為@Primary的Bean將作為首選者,否則將拋出異常

@Qualifier

注解在變量上
指定注入Bean的名稱

@Async

注解在方法上
異步方法調用


MyBatis-Plus注解

@TableName

注解在類上
實體類對應的數據庫表名

@TableId

注解在變量上
表主鍵標識

@TableField

注解在變量上
表字段標識

exist="是否存在,設置為true時表示該屬性為數據庫表字段。@TableName類字段默認為true,非數據庫字段需要標識exist = false"

@TableLogic

注解在變量上
表字段邏輯刪除標識


注入相關注解

@SpringBootApplication

注解在類上
表明啟動類。@SpringBootApplication = (默認屬性)@Configuration + @EnableAutoConfiguration + @ComponentScan?

@Component

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

@ComponentScan

注解在類上
@ComponentScan 主要就是定義掃描的路徑從中找出標識了需要裝配的類自動裝配到spring的bean容器中

@Autowired

注解在變量上
按照類型注入變量。

@Resource

注解在變量上
默認按照ByName自動注入變量。

@Autowired和@Resource兩個注解的區別:
(1)@Autowired默認按照byType方式進行bean匹配,@Resource默認按照byName方式進行bean匹配
(2)@Autowired是Spring的注解,@Resource是J2EE的注解

@Value

注解在變量上

  • @Value(“${xxxx}”)注解從配置文件讀取值的用法

    @Value("${init.password}")  
    private String initPwd;   
    
  • @Value(“#{}”) 表示SpEl表達式通常用來獲取bean的屬性,或者調用bean的某個方法。當然還有可以表示常量

    @Value("#{dataSource.url}") //獲取bean的屬性  
    private String jdbcUrl;  
    @Value("#{'Spring Expression Language'}") //獲取字符串常量  
    private String str;  
    @Value("#{1}")  
    private int number; //獲取數字 1  
    

@Configurable

注解在類上
@Configurable(preConstruction = true) 這個注解的作用是:告訴Spring在構造函數運行之前將依賴注入到對象中。使用該注解需要注意的地方:

  • 需要在項目中添加如下jar包:aspectj-x.x.x.jar, aspectjrt.jar, aspectjveawer-x.x.x.jar
  • 將基于Spring的java代理添加到運行配置中:-javaagent:"PATH\spring-instrument-x.x.x.jar"

@Configuration

注解在類上
從Spring3.0, @Configuration用于定義配置類,可替換xml配置文件, 被注解的類內部包含有一個或多個被@Bean注解的方法,? ?
這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描, 并用于構建bean定義,
初始化Spring容器。?
注意:@Configuration 注解的配置類有如下要求:

  • @Configuration 不可以是final類型;
  • @Configuration 不可以是匿名類;
  • 嵌套的configuration必須是靜態類。??

@Bean

注解在方法上
產生一個Bean對象,然后這個Bean對象交給Spring管理產生這個Bean對象的方法Spring只會調用一次,
隨后這個Spring將會將這個Bean對象放在自己的IOC容器中。需要在@Configuration注解下使用。?

@EnableAutoConfiguration

注解在變量上
將外部的值動態注入到Bean中。?

@Scope(value = "request")

注解在類或方法上
@Scope注解是springIoc容器中的一個作用域
在 Spring IoC 容器中具有以下幾種作用域:

  • 基本作用域singleton(單例)
  • prototype(多例)
  • Web 作用域(reqeust、session、globalsession)
  • 自定義作用域

生命周期注解

@PostConstruct

注解在方法上
用來修飾一個非靜態的void()方法。被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,并且只會被服務器執行一次。PostConstruct在構造函數之后執行,init())方法之前執行。


定時相關注解

@EnableScheduling

注解在類上
定時任務在配置類上添加@EnableScheduling開啟對定時任務的支持,在相應的方法上添加@Scheduled聲明需要執行的定時任務。
?常見問題:https://www.cnblogs.com/domi22/p/9418433.html?
a: 單線程任務丟失,轉為異步線程池
b: 關于分布式情況下,重復執行的問題(兩種方案)
1:可以使用redis的分布式鎖保證spring schedule集群只執行一次。 r
edis分布式鎖是通過setnx命令實現的。該命令的作用是,當往redis中存入一個值時,會先判斷該值對應的key是否存在,
如果存在則返回0,如果不存在,則將該值存入redis并返回1。(但是在分布式跨時區部署的時候,依然無法避免重復執行)
??2:可以通過使用shedlock將spring schedule上鎖。詳細見:https://segmentfault.com/a/1190000011975027
?c: 服務器宕機之后,丟失的任務如何補償? 
可以將每次的任務執行時間緩在redis里,下次執行任務的時候都取出該時間,判斷是否為上一個周期,
如果不是,可以計算出中間丟失的周期數,然后做響應的補償操作。如果怕redis宕機,可以將“執行時間”持久化到表中。

@Scheduled(cron = "0 0 1 1/1 * ?")


緩存相關注解

@EnableCaching

注解在類上
@EnableCaching注解是spring framework中的注解驅動的緩存管理功能。自spring版本3.1起加入了該注解。如果你使用了這個注解,那么你就不需要在XML文件中配置cache manager了。
當你在配置類(@Configuration)上使用@EnableCaching注解時,會觸發一個post processor,這會掃描每一個spring bean,查看是否已經存在注解對應的緩存。如果找到了,就會自動創建一個代理攔截方法調用,使用緩存的bean執行處理。
https://blog.csdn.net/dreamhai/article/details/80642010

@Cacheable

注解在類或方法上
當標記在一個方法上時表示該方法是支持緩存的,當標記在一個類上時則表示該類所有的方法都是支持緩存的。
對于一個支持緩存的方法,Spring會在其被調用后將其返回值緩存起來,以保證下次利用同樣的參數來執行該方法時可以直接從緩存中獲取結果,而不需要再次執行該方法。
Spring在緩存方法的返回值時是以鍵值對進行緩存的,值就是方法的返回結果,至于鍵的話,Spring又支持兩種策略,默認策略和自定義策略。
需要注意的是當一個支持緩存的方法在對象內部被調用時是不會觸發緩存功能的。@Cacheable可以指定三個屬性,value、key和condition。


切面相關注解

@Aspect

注解在類上
標識該類為切面類

@Pointcut

注解在方法上
定義切點
如 @Pointcut("execution(* com.lanhuigu.spring.ConferenceServiceImpl.conference(..))")


注解1.png
格式: execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) 
修飾符匹配(modifier-pattern?)
返回值匹配(ret-type-pattern)可以為*表示任何返回值,全路徑的類名等
類路徑匹配(declaring-type-pattern?)
方法名匹配(name-pattern)可以指定方法名 或者 *代表所有, set* 代表以set開頭的所有方法
參數匹配((param-pattern))可以指定具體的參數類型,多個參數間用“,”隔開,各個參數也可以用“*”來表示匹配任意類型的參數,如(String)表示匹配一個String參數的方法;(*,String) 表示匹配有兩個參數的方法,第一個參數可以是任意類型,而第二個參數是String類型;可以用(..)表示零個或多個任意參數
異常類型匹配(throws-pattern?)
其中后面跟著“?”的是可選項
比如:
1)execution(* *(..))  
//表示匹配所有方法  
2)execution(public * com.savage.service.UserService.*(..))  
//表示匹配com.savage.server.UserService中所有的公有方法  
3)execution(* com.savage.server..*.*(..))  
//表示匹配com.savage.server包及其子包下的所有方法 

通知類型

注解在方法上

@Before

前置通知,在目標方法被調用之前調用通知功能

@After

后置通知,在目標方法完成之后調用通知,不會關心方法的輸出是什么。

@AfterReturning

返回通知,在目標方法成功執行之后調用通知

@AfterThrowing

異常通知,在目標方法拋出異常后調用通知

@Around

環繞通知,通知包裹了被通知的方法,在被通知的方法調用之前和之后執行自定義的行為


lombok注解

@Data

注解在類上
為類提供讀寫屬性, 此外還提供了 equals()、hashCode()、toString() 方法

@Setter / @Getter

注解在類上
為相應的屬性自動生成Getter/Setter方法

@Accessors

存取器,用于配置getter和setter方法的生成結果

fluent="流暢的,設置為true,則getter和setter方法的方法名都是基礎屬性名,且setter方法返回當前對象"
chain="鏈式的,設置為true,則setter方法返回當前對象"
prefix="前綴,用于生成getter和setter方法的字段名會忽視指定前綴(遵守駝峰命名)"

@Cleanup

注解在變量上
該注解能幫助我們自動調用數據流的close()方法,很大的簡化了代碼。

@AllArgsConstructor

注解在類上
使用后添加一個構造函數,該構造函數含有所有已聲明字段屬性參數

@NoArgsConstructor

注解在類上
使用后創建一個無參構造函數

@Builder

注解在類上
用一個內部類去實例化一個對象,避免一個類出現過多構造函數

@EqualsAndHashCode

注解在類上
默認情況下,會使用所有非靜態(non-static)和非瞬態(non-transient)屬性來生成equals和hasCode,
也能通過exclude字段來排除一些屬性。

@Log4j2

注解在類上
不需要定義Logger屬性,即可輸出日志文件
日志級別包含 debug,info,warn,error,fatal。


JDK注解

@Override

注解在方法上
表示重寫父類方法,編譯時期報錯,提高可讀性

@Deprecated

注解在方法上
表示方法已經過時

@SuppressWarnings

注解在類或方法或變量上
忽略指定的警告


參數校驗注解

@Valid

注解在成員屬性 / 構造函數 / 方法 / 方法參數上
用于校驗參數,與實體類校驗注解聯合使用,否則實體類校驗注解無效

@Validated

注解在類型 / 方法 / 方法參數上
用于校驗參數,與實體類校驗注解聯合使用,否則實體類校驗注解無效

@Validated和@Valid兩個注解的區別:
(1)@Validated提供分組功能,可以在參數驗證時,根據不同的分組采用不同的驗證機制
(2)注解位置不同
@Valid:可以用在方法、構造函數、方法參數和成員屬性(字段)上
@Validated:可以用在類型、方法和方法參數上。但是不能用在成員屬性(字段)上
兩者是否能用于成員屬性(字段)上直接影響能否提供嵌套驗證的功能。
(3)@Valid使用Hibernate Validation,@Validated對@Valid進行了二次封裝,使用Spring Validator。

@NotNull

注解在類型 / 方法 / 方法參數 / 成員屬性上
校驗參數不為空,能幫助避免空指針

@NotEmpty

注解在類型 / 方法 / 方法參數 / 成員屬性上
不能為null,而且長度必須大于0

@NotBlank

注解在類型 / 方法 / 方法參數 / 成員屬性上
只能作用在String上,不能為null,而且調用trim()后,長度必須大于0

@Min / @DecimalMin / @Max / @DecimalMax

注解在類型 / 方法 / 方法參數 / 成員屬性上
注解的變量必須是一個大于或等于 / 小于或等于 該值的數字

@Size(min=下限, max=上限)

注解在類型 / 方法 / 方法參數 / 成員屬性上
驗證注解的元素值的在min和max(包含)指定區間之內,如字符長度、集合大小

@Length(min=下限, max=上限)

注解在類型 / 方法 / 方法參數 / 成員屬性上
只能作用在String上,驗證注解的元素值長度在min和max區間內

@Digits(integer=整數位數, fraction=小數位數)

注解在類型 / 方法 / 方法參數 / 成員屬性上
驗證注解的元素值的整數位數和小數位數上限

@Past / @Future

注解在類型 / 方法 / 方法參數 / 成員屬性上
驗證注解的元素值(日期類型)比當前時間早 / 晚

@AssertTrue / @AssertFalse

注解在類型 / 方法 / 方法參數 / 成員屬性上
驗證注解的元素值是true / false


Swagger注解

@Api

注解在類上
表示對類的說明,也代表了這個類是swagger2的資源

tags="說明該類的作用,參數是個數組,可以填多個"
value="該參數沒什么意義,在UI界面上不顯示,所以不用配置"
description = "用戶基本信息操作"

@ApiOperation

注解在方法上
表示一個http請求訪問該方法的操作

value="方法的用途和作用"    
notes="方法的注意事項和備注"    
tags="說明該方法的作用,參數是個數組,可以填多個"
格式:tags={"作用1","作用2"} //不建議使用這個參數,會使界面看上去有點亂,前兩個常用

@ApiModel

注解在類上
用于說明實體作用

description="描述實體的作用"  

@ApiProperty

注解在變量上
描述實體類的屬性

value="用戶名"  描述參數的意義
name="name"    參數的變量名
required=true  參數是否必選

@ApiParam

注解在變量上
表示對參數的要求和說明

name="參數名稱"
value="參數的簡要說明"
defaultValue="參數默認值"
required="true" //表示屬性是否必填,默認為false

Gson注解

@SerializedName

注解在變量上
序列化 / 反序列化時的名稱,解決了我們 Model 和 JSON 不對應的問題

@Expose

注解在變量上
對變量的序列化和反序列化單獨控制

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