Java 常用注解 一次性掃盲
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質(zhì)文章,第一時間送達
@Target
作用: 指明了修飾的這個注解的使用范圍, 即被描述的注解可以用在哪里
@Target(ElementType.Type)ElementType取值的類型:
TYPE: 類,接口或者枚舉
FIELD: 域,包含枚舉常量
METHOD: 方法
PARAMETER: 參數(shù)
CONSTRUCTOR: 構造方法
LOCAL_VARIABLE: 局部變量
ANNOTATION_TYPE: 注解類型
PACKAGE: 包
@Retention
作用: 指明修飾的注解的生存周期, 即會保留到哪個階段
RetentionPolicy的取值類型有三種:
SOURCE: 源碼級別保留,編譯后即丟棄
CLASS: 編譯級別保留,編譯后的class文件中存在,在jvm運行時丟棄,這是默認值
RUNTIME: 運行級別保留,編譯后的class文件中存在,在jvm運行時保留,可以被反射調(diào)用
@Documented
作用: 指明修飾的注解,可以被例如javadoc此類的工具文檔化
只負責標記
沒有成員取值
@Inherited
作用: 允許子類繼承父類中的注解
@Inherited需要和@AliasFor一起使用: 在子注解對應的屬性使用@AliasFor
注解是可以繼承的,但是注解是不能繼承父注解的屬性
也就是說,在類掃描時的注解的屬性值依然是父注解的屬性值,而不是自定義注解的屬性值
需要在注解的屬性上使用@AliasFor
@ComponentScan
作用: 定義掃描的路徑從中找出標識了需要裝配的類自動裝配到spring的bean容器中
默認會掃描該類所在的包下所有的配置類
@ComponentScan中的參數(shù)類型:
FilterType.ANNOTATION: 按照注解
FilterType.ASSIGNABLE_TYPE: 按照給定的類型
FilterType.ASPECTJ: 使用ASPECTJ表達式
FilterType.REGEX: 使用正則表達式
FilterType.CUSTOM: 按照自定義規(guī)則
FilterType.ANNOTATION: 按照注解
FilterType.ASSIGNABLE_TYPE: 按照給定的類型
FilterType.ASPECTJ: 使用ASPECTJ表達式
FilterType.REGEX: 使用正則表達式
FilterType.CUSTOM: 按照自定義規(guī)則
value: 用于對指定包的路徑進行掃描
basePackages: 用于指定包的路徑進行掃描,用法和value一樣.建議使用value
basePackageClasses: 用于對指定某個類的所在的包的路徑進行掃描
nameGenerator: 用于為Spring容器中的檢測到bean組件命名
useDefaultFilters: 是否開啟對 @Component,@Repository,@Service,@Controller的類進行檢測
excludeFilters: 按照過濾條件進行排除
includeFilters: 按照過濾條件進行包含
@Filter
作用: 配置過濾條件的過濾器注解
@Filter中的參數(shù)類型:
type
class
@interface
作用: 自定義注解
自動繼承java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節(jié)
在定義注解時,不能繼承其他的注解或接口
@interface用來聲明一個注解:
其中的每一個方法實際上是聲明一個配置參數(shù)
方法的名稱就是參數(shù)的名稱
方法的返回值類型就是參數(shù)的類型
返回值類型只能是基本類型,Class,String,enum
可以通過default來聲明參數(shù)的默認值
定義注解的格式:
public @interface 注解名 {定義體}注解參數(shù)支持的數(shù)據(jù)類型:
基本數(shù)據(jù)類型: int,float,boolean,byte,double,char,long,short
String類型
Class類型
enum類型
Annotation類型
以上類型組合的數(shù)組
Annotation類型中參數(shù)設定規(guī)則:
只能用public或default默認訪問權修飾:
參數(shù)成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數(shù)據(jù)類型和String,Enum,Class,annotations等數(shù)據(jù)類型,以及這一些類型的數(shù)組
如果只有一個參數(shù)成員,最好把參數(shù)名稱設為value,后加小括號
注解元素的默認值:
注解元素必須有確定的值
要么在定義注解的默認值中指定,要么在使用注解時指定,非基本類型的注解元素的值不可為null
因此使用空字符串或0作為默認值約束
這個約束使得處理器很難表現(xiàn)一個元素的存在或缺失的狀態(tài):
因為每個注解的聲明中,所有元素都存在,并且都具有相應的值
為了繞開這個約束,只能定義一些特殊的值(比如空字符串或者負數(shù)),表示某個元素不存在
@AliasFor
作用: 為注解的屬性添加別名
在同一個注解內(nèi),對兩個不同的屬性一起使用,互為別名:
無論為哪個屬性名設置屬性值,另一個屬性名也是同樣的屬性值
互為別名的屬性值必須相同,否則會報錯
屬性必須要有默認的屬性值
public @interface RequestMapping {
@AliasFor("path") // 此時path和value值必須是一樣的,否則會報錯
String[] value() default {};
@AliasFor("value") // 此時path和value值必須是一樣的,否則會報錯
String[] path() default {};
}顯式的覆蓋元注解中的屬性:
顯式的為元注解的屬性設置別名
屬性類型,屬性默認值必須相同
@AliasFor只能為作為當前注解的元注解起別名
示例:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AopConfig.class)
public class AopUtilsTest {}要想替換 @ContextConfiguration(classes = AopConfig.class) 注解,可以這樣定義一個標簽:
@Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration
public @interface Context {
@AliasFor(value = "classes", annotation = ContextConfiguration.class)
Class<?>[] cs() default {};
}因為 @ContextConfiguration注解本身被定義為 @Inherited的,所以Context注解即可理解為繼承 @ContextConfiguration注解
cs屬性等同于 @ContextConfiguration屬性中的classes屬性.使用了 @AliasFor標簽,分別設置:
value: 作為哪個屬性的別名
annotation: 作為哪個注解的別名
使用Context標簽的可以達到同樣效果:
@RunWith(SpringJUnit4ClassRunner.class)
@STC(cs = AopConfig.class)
public class AopUtilsTest {}在一個注解中隱式聲明別名:
@ContextConfiguration
public @interface MyTestConfig {
@AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
String[] value() default {};
@AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
String[] groovyScripts() default {};
@AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
String[] xmlFiles() default {};
}這就是在統(tǒng)一注解中隱式聲明別名:
在MyTestConfig注解中 ,value,groovyScripts,xmlFiles都定義為@AliasFor(annotation = ContextConfiguration.class, attribute = "locations")的別名
在這個注解中 ,value,groovyScripts和xmlFiles也互為別名
別名的傳遞:
如果A是B的別名,并且B是C的別名,那么A是C的別名
@AliasFor注解是允許別名之間的傳遞的:
@MyTestConfig
public @interface GroovyOrXmlTestConfig {
@AliasFor(annotation = MyTestConfig.class, attribute = "groovyScripts")
String[] groovy() default {};
@AliasFor(annotation = ContextConfiguration.class, attribute = "locations")
String[] xml() default {};
}GroovyOrXmlTestConfig把 @MyTestConfig作為元注解
定義了groovy屬性,并作為MyTestConfig中的groovyScripts屬性的別名
定義了xml屬性,并作為ContextConfiguration中的locations屬性的別名
因為MyTestConfig中的groovyScripts屬性本身就是ContextConfiguration中的locations屬性的別名,所以xml屬性和groovy屬性也互為別名
@Alias中的屬性:
annotation: 類類型,別名屬性的類的類型,即別名的屬性屬于哪個注解類
attribute: 需要別名的屬性
value: 屬性的別名
@Import
@Import支持導入普通的Java類,并聲明為一個Bean
@Import使用場景:
@Import主要用在基于Java代碼顯式創(chuàng)建bean的過程中
@Import用于將多個分散的Java Config配置類融合成一個完整的config類
配置類的組合主要發(fā)生在跨模塊或者跨包的配置類引用過程中: 將多個按功能或者按業(yè)務劃分的配置文件導入到單個配置文件中,避免將所有配置寫在一個配置中
@Import與@ImportResource注解的作用類似
使用@ImportResource和@Value可以進行資源文件的讀取
SpringBoot
@SpringBootApplication
包含:
@Configuration
@EnableAutoConfiguration
@ComponentScan
通常用在主類上
@ConfigurationProperties
可以使用 @ConfigurationProperties獲取大量配置在application.properties和application.yml中參數(shù)的參數(shù)值
@ConfigurationProperties的使用: 要為每個捕獲的外部屬性提供一個帶有字段的類
可以將類類型的bean使用@Bean注解的方法注入到另一個bean中,那么這個bean可以以類型安全的方式訪問外部配置的參數(shù)值
前綴prefix定義的相關的外部屬性要綁定到類的字段上
根據(jù)SpringBoot寬松的綁定規(guī)則,類屬性的名稱必須與外部屬性名稱匹配
可以簡單地用一個值初始化一個字段來定義一個默認值. 最好與配置文件中的值相同
類本身可以是包私有的
類的字段必須有公共setter方法
激活@ConfigurationProperties:
通過添加 @Component注解讓ComponentScan掃描到
只有當該類所在的包被Spring的@ComponentScan掃描到才會生效.默認情況下,該注解會掃描在主應用類下所有包結構
@Component
@ConfigurationProperties(prefix = "spring.logger")
class LogProperties {
...
}通過Spring的Java Configuration特性激活@ConfigurationProperties
只要MailModuleConfiguration類被SpringBoot應用掃描到,就可以在應用上下文中訪問MailModuleProperties bean
@Configuration
class PropertiesConfig {
@Bean
public LogModuleProperties logModuleProperties() {
return new logModuleProperties();
}
}同時可以使用 @EnableConfigurationProperties注解使得SpringBoot找到這個類. 這個注解用了 @Import(EnableConfigurationPropertiesImportSelector.class) 實現(xiàn)
@Configuration
@EnableConfigurationProperties(LogModuleProperties.class)
class PropertiesConfig {
}激活一個 @ConfigurationProperties類時最好模塊化應用程序,并讓每個模塊提供自己的 @ConfigurationProperties類,只提供模塊需要的屬性.這樣可以使得在不影響其他模塊的情況下重構一個模塊中的屬性變得更加方便.因此不建議在程序類本身上使用 @EnableConfigurationProperties, 應該在特定模塊的 @Configuration類上使用 @EnableConfigurationProperties, 該類也可以利用包私有的可見性對特定應用程序其余部分隱藏屬性
@ConfigurationProerties中無法轉(zhuǎn)換的屬性:
當為 @ConfigurationProperties中的屬性配置錯誤的值時,又不希望SpringBoot應用啟動失敗.可以設置ignoreInvalidFields注解屬性為true, 默認為false
@ConfigurationProperties(prefix = "spring.logger", ignoreInvalidFields = true)
public class LogModuleProperties {
private Boolean enabled = Boolean.True;
}SpringBoot將會設置enable字段為設定好的默認值. 如果沒有設定默認值 ,enabled的值將為null, 因為這里定義的是boolean的包裝類Boolean
@ConfigurationProperties中未知的屬性:
默認情況下,SpringBoot會忽略不能綁定到 @ConfigurationProperties類字段的屬性
當配置文件中又一個屬性實際沒有綁定到 @ConfigurationProperties類時,希望SpringBoot啟動失敗
或者是以前使用過這個屬性,但已經(jīng)被刪除了,希望被觸發(fā)告知手動從application.properties刪除這個屬性
這是需要設置ignoreUnknownFields注解屬性為false, 默認為true
@ConfigurationProperties(prefix = "spring.logger", ignoreUnknownFields = false)
class LogModuleProperties {
private Boolean enabled = Boolean.TRUE;
private String defaultSubject;
}對于ignoreUnkownFields, 在SpringBoot中可能有兩個帶有@ConfigurationProperties的類,同時綁定到了同一個命名空間 (namespace) 上,其中一個類可能知道某個屬性,另一個類卻不知道某個屬性,這樣會導致啟動失敗.所以這個屬性不再使用
啟動時校驗@ConfigurationProperties:
如果希望配置參數(shù)在傳入到應用中是有效的,可以通過在字段上添加bean validation注解,同時在類上添加 @Validated注解
@ConfigurationProperties(prefix = "spring.logger")
@Validated
@Data
class LogModuleProperties {
@NotNull private Boolean enabled;
@NotEmty private String defaultSubject;
} 如果這些默認的驗證注解不能滿足驗證要求的,可以自定義注解. 如果驗證邏輯很特殊,可以實現(xiàn)一個方法,并用 @PostConstruct標記,如果驗證失敗,方法拋出異常即可
復雜屬性類型:
有兩種方式讓SpringBoot自動填充List屬性:
在application.properties文件中以數(shù)組形式書寫
spring.logger.smtpServers[0]=server1
spring.logger.smtpServers[1]=server1application.yml本身支持List類型,可以在application.yml文件中添加
spring:
mail:
smtpServers:
- server1
- server2set集合也是使用同樣的配置方式
推薦使用YML做數(shù)據(jù)配置,能夠更好的閱讀,層次分明
Duration:
SpringBoot內(nèi)置支持從配置參數(shù)中解析duration(持續(xù)時間):
@Data
@ConfigurationProperties(prefix = "spring.logger")
class loggerModuleProperties {
private Duration pauseBetweenLogs;
}既可以配置毫秒數(shù)值,也可以配置帶有單位的文本:
spring.logger.pause-between-logs=5s如果配置duration沒有寫單位,默認按照毫秒來指定,也可以通過 @DurationUnit來指定單位:
@Data
@ConfigurationProperties(prefix = "spring.logger")
class loggerModuleProperties {
@DurationUnit(ChronoUnit.SECONDS)
private Duration pauseBetweenLogs;
}常用單位如下:
ns: NANOSECONDS - 納秒
us: MICROSECONDS - 微秒
ms: MILLISECONDS - 毫秒
s: SECONDS - 秒
m: MINUTES - 分
h: HOURS - 時
d: DAYS - 天
DataSize:
與Duration用法一樣,默認單位是byte(字節(jié)) , 可以通過@DataSizeUnit單位指定
@Data
@ConfigurationProperties(prefix = "spring.logger")
class loggerMailModuleProperties {
@DataSizeUnit(DataUnit.MEGABYTES)
private DataSize maxAttachmentSize = DataSize.ofMegebytes(2);
}添加配置:
spring.logger.max-attachment-size=1MB輸出的結果都是以B(bytes) 為單位顯示的
常見單位如下:
B: BYTES
KB: KILOBYTES
MB: MEGEBYTES
GB: GIGABYTES
TB: TERABYTES
自定義類型:
有時候,想解析配置參數(shù)到自定義的對象類型上,比如自定義物品重量:
spring.logger.max-attachment-weight=5kg在MailModuleProeprties中添加Weight屬性:
@Data
@ConfigurationProperties(prefix = "spring.logger")
class MailModuleProperties {
private Weight maxAttachmentWeight;
}創(chuàng)建自定義轉(zhuǎn)換器converter:
class WeightConverter implements Convert<String, Object> {
@Override
public Weight convert(String source) {
// 根據(jù)String類型的source創(chuàng)建并返回一個Weight類型的對象
}
}將自定義轉(zhuǎn)換器converter注冊到SpringBoot上下文中
@Configuration
class PropertiesConfig {
@Bean
@ConfigurationPropertiesBinding
public WeightConverter weightConverter() {
return new WeightConverter();
}
}@ConfigurationPropertiesBinding注解是讓SpringBoot使用該轉(zhuǎn)換器做數(shù)據(jù)綁定
標記配置屬性為Deprecated:
@DeprecatedConfigurationProperty(reason = "change name", replacement = "none")
public String getDefaultSubject() {
return defaultSubject;
}可以通過添加 @DeprecatedConfigurationProperty注解到字段的getter方法上,來標示該字段為deprecated
SpringBoot的 @ConfigurationProperties注解在綁定類型安全的Java Bean時是非常強大的
可以配合其注解屬性和 @DeprecatedConfigurationProperty注解讓配置更加模塊化
如果使用SpEL表達式,只能選擇 @Value注解
@Repository
用于標注數(shù)據(jù)訪問組件,即DAO組件
@Service
用于標注業(yè)務層組件
@RestController
用于標注控制層組件
包含:
@Controller
@ResponseBody
@Controller
用于標注控制層組件
需要返回頁面時要使用 @Controller而不是 @RestController
@ControllerAdvice
用于定義 @ExceptionHandler, @InitBinder, @ModelAttribute, 并且應用到所有 @RequestMapping中
@InitBinder: 在執(zhí)行之前初始化數(shù)據(jù)綁定器
@ModelAttribute: 把值綁定到Model中,可以獲取到該值
@ExceptionHandler: 全局異常捕捉處理
@Component
泛指組件
當組件無法歸類時,可以使用這個注解進行標注
@ResponseBody
表示該方法的返回結果直接被寫入http response body中
一般在異步獲取數(shù)據(jù)時使用
在使用 @RequestMapping后,返回值通常解析為跳轉(zhuǎn)路徑
比如:
加上 @ResponseBody后返回結果不會被解析為跳轉(zhuǎn)路徑,而是直接寫入HTTP Response Body中
異步獲取json數(shù)據(jù),加上 @ResponseBody后,會直接返回json數(shù)據(jù)
@RequestBody
參數(shù)前加上這個注解,表示該參數(shù)必填
表示接收json字符串轉(zhuǎn)為對象List
@ComponentScan
組件掃描
掃描到有 @Component, @Cotroller, @Service等這些注解的類,就會把這些類注冊為bean*
@Configuration
表示該類是Bean的信息源
相當于XML中的,一般標注在主類上
@ConditionOnProperty
控制Configuration在條件成立時生效
屬性:
value: 數(shù)組,獲取對應property的名稱,與name不可以同時使用
prefix: property名稱的前綴,可有可無
name: 數(shù)組 ,property完整名稱或者部分名稱(與prefix組合使用,組成完整的property名稱),不可以與value同時使用
havingValue: 可與name組合使用,比較獲取到的屬性值與havingValue給定的值是否相同,相同才加載配置
matchMissing: 缺少該property時是否可以加載. 如果為true, 沒有該property也會正常加載. 如果為false, 則沒有該property時則會報錯,默認為false
relaxedNames: 是否支持松散匹配
@Bean
相當于XML中的,標注在方法上
表示生成一個bean, 并交給Spring管理
@EnableAutoConfiguration
使SpringBoot根據(jù)應用所聲明的依賴來對Spring框架進行配置
一般加在主類上
@Autowired
byType方式
使用已經(jīng)配置好的Bean, 完成屬性,方法的組裝
可以對類成員,方法以及構造函數(shù)進行標注,完成自動裝配的工作
如果加上 @Autowired(required = false), 當找不到bean時也不會報錯
@Qualifier
當有多個同一類型的Bean時,可以使用 @Qualifier("name") 來指定
需要和 @Autowired一起使用
@Resource
@Resource(name = "name", type = "type")
如果沒有屬性的話,默認為byName, 與 @Autowired功能類似
@RequestMapping
@RequestMapping是一個用來處理請求地址映射的注解,可以使用在類或者方法上
用在類上時,表示類中所有響應請求的方法都以該地址作為父路徑
@RequestMapping有六個屬性:
params: 指定request中必須包含某些參數(shù)值,才讓該方法處理請求
headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求
value: 指定請求的實際地址. 指定的地址可以是URI Template模式
method: 指定請求的method類型 ,GET, POST, PUT,DELETE等
consumes: 指定處理請求的提交內(nèi)容類型 - Content-Type. 比如: application,json,text,html
produces: 指定返回的內(nèi)容類型,僅當request請求頭中的 (Accept) 類型中包含該指定類型才返回
@GetMapping
@GetMapping, @PostMapping是組合注解
相當于 @RequestMapping(value = "/", method = RequestMethod.Get(Post, Put, Delete))
@RequestParam
用在方法的參數(shù)前面
相當于 request.getParameter
@PathVariable
路徑變量: RequestMapping("user/get/mac/{macAddress}")
public String getByMacAddress(@PathVariable("macAddress") String macAddress) {}參數(shù)與大括號里的名字相同的話,注解后括號里的內(nèi)容可以不填
全局異常處理
@ControllerAdvice
包含 @Component
可以被掃描到
統(tǒng)一異常處理
@ExceptionHandler
@Exceptionhandler(Exception.class)
用在方法上面,表示遇到這個異常就執(zhí)行這個方法
SpringCloud
@EnableEurekaServer
用在SpringBoot啟動類上
表示這是一個Eureka服務注冊中心
@EnableDiscoveryClient
用在SpringBoot啟動類上
表示這是一個服務,可以被注冊中心找到
@LoadBalanced
開啟負載均衡能力
@EnableCircuitBreaker
用在SpringBoot啟動類上
開啟斷路器功能
HystrixCommand
@HystrixCommand(fallbackMethod = "backMethod")
用在方法上,表示fallbackMethod指定斷路回調(diào)方法
@EnableConfigServer
用在SpringBoot啟動類上
表示這是一個配置中心,開啟Config Server
@EnableZuulProxy
用在SpringBoot啟動類上
表示開啟zuul路由
@SpringCloudApplication
微服務注解集合,包含:
@SpringBootApplication: SpringBoot注解
@EnableDiscoveryClient: 注冊服務中心Eureka注解
@EnableCircuitBreaker: 斷路器注解
這是每一個微服務必須應該有的注解
作者 | 攻城獅Chova
來源 | cnblogs.com/chova/p/14943944.html

