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(..))")
格式: 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="字段是否參與反序列化"