Java常用注解(Annotation)詳解匯總
關(guān)注“后端碼匠”
優(yōu)質(zhì)文章第一時(shí)間送達(dá)!
一,元注解(用來修飾注解的注解)
二,Spring中的注解
SpringMVC注解 IOC容器注解 Bean的范圍的注解: Bean的生命周期注解: Spring啟動類注解(開箱即用): 請求Mapping注解 動態(tài)賦值注解 緩存注解
三,AOP切面注解
四,常用插件注解
Lombok 插件 MybatisPlus 注解 Shiro 注解
五,其他注解
Async異步注解 注釋注解 其他注解
先來說說什么是注解:
注解其實(shí)就是代碼里的特殊標(biāo)記,它用于替代配置文件,有了注解技術(shù)后,開發(fā)人員可以通過注解告訴類如何運(yùn)行。通過元注解來定義(修飾)自定義注解并定義所需要實(shí)現(xiàn)的功能。注解可以標(biāo)記在包、類、屬性、方法,方法參數(shù)以及局部變量上,且同一個(gè)地方可以同時(shí)標(biāo)記多個(gè)注解。在Java技術(shù)里注解的典型應(yīng)用是:可以通過反射技術(shù)去得到類里面的注解,以決定怎么去運(yùn)行類。
一,元注解(用來修飾注解的注解)
從JDK 1.5開始, Java增加了對元數(shù)據(jù)(MetaData)的支持,提供了4個(gè)標(biāo)準(zhǔn)的用來對注解類型進(jìn)行注解的注解類,我們稱之為 meta-annotation(元注解)
@Target(ElementType.) 描述注解的使用范圍(即:被修飾的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述構(gòu)造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部變量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述參數(shù)
7.TYPE:用于描述類、接口(包括注解類型)或enum聲明
@Retention(RetentionPolicy.) 描述注解的生命周期(即:被修飾的注解被保留到何時(shí))
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留)
@Documented 會被javadoc工具動態(tài)提取成文檔。
@Inherited 允許子類繼承父類中的注解。
二,Spring中的注解
SpringMVC注解
這些注解描述的類 Spring會創(chuàng)建原生對象或代理對象并交給 IOC容器 管理,這些對象稱之為bean。用時(shí)直接 @Autowired 注入即可。
@Mapper 描述數(shù)據(jù)層 (Mapper)
@Service 描述業(yè)務(wù)層 (Service)
@Repository 標(biāo)識持久層 / 數(shù)據(jù)訪問層組件(Dao)
@Component 可以描述各種組件(當(dāng)組件不好歸類時(shí))
@RestController 描述控制層(Controller)并返回json數(shù)據(jù)類型,但不會再執(zhí)行SpringMVC中的視圖解析器。
/* 該注解等同于:@Controller + @ResponseBody */
@Controller 描述控制層 接收用戶請求 執(zhí)行 視圖解析器 (進(jìn)行路徑拼接 前綴+后綴 ViewResolver解析 view渲染)。
@ResponseBody 將java對象轉(zhuǎn)為json格式的數(shù)據(jù)。
IOC容器注解
IOC(Inversion of Control) 是控制反轉(zhuǎn),也叫依賴注入(DI)。
把復(fù)雜系統(tǒng)分解成相互合作的對象,這些對象類通過封裝以后,內(nèi)部實(shí)現(xiàn)對外部是透明的,從而降低了解決問題的復(fù)雜度,而且可以靈活地被重用和擴(kuò)展。
簡單來說:IOC意味著將你設(shè)計(jì)好的對象交給容器控制,需要的時(shí)候通過注解來注入(獲取),而不是傳統(tǒng)的在你的對象內(nèi)部直接控制(new 對象)。從而降低了程序的耦合性。
@Bean 描述 方法 的返回值 交給容器管理,不需要再手動調(diào)用該方法。
@Autowired 注入對象(按byType自動注入)
@Resource 注入對象(按byName自動注入)
@Value 注入普通類型屬性。
如果容器中有多個(gè)相同類型的 bean,則框架將拋出 NoUniqueBeanDefinitionException, 以提示有多個(gè)滿足條件的
bean 進(jìn)行自動裝配。程序無法正確做出判斷使用哪一個(gè)時(shí),可以使用以下注解??
@Qualifier("") 在相同類型bean上命名后,可以按不同名稱注入 配合@Autowired 使用。
@Primary 當(dāng)存在多個(gè)相同類型的 bean 時(shí),首選被@Primary注解過的bean。
Bean的范圍的注解:
@Scope(value="") 默認(rèn)生成的類是單例的。
取值(value) 有:
1.singleton :單例
2.prototype :多例
3.request :request域,需要在web環(huán)境
4.session :session域,需要在web環(huán)境
5.application:context域,需要在web環(huán)境
6.globalsession 集群環(huán)境的session域,需要在web環(huán)境
Bean的生命周期注解:
@PostConstruct 相當(dāng)于init-method
@PreDestroy 相當(dāng)于destroy-method
Spring啟動類注解(開箱即用):
只需要導(dǎo)入簡單的jar包文件,就可以實(shí)現(xiàn)對應(yīng)的功能,無需(少量)繁瑣的配置。
@SpringBootAppliction 用在啟動類上,主要目的是開啟自動配置 組合了:
1)@SpringBootConfiguration 定義了SpringBoot的配置類 通過@Configuration 來定義配置信息
2)@EnableAutoConfiguration 自動化配置, 該注解里面有@AutoConfigurationPackage 自動配置的包掃描 @Import調(diào)用選擇器去加載pom.xml文件中的啟動項(xiàng)
3)@ComponentScan 定義包掃描 指定路徑 哪些包中的對象交給IOC容器管理。
請求Mapping注解
@RequestMapping("/xxx") 注解類上 通過"/xxx"來指定控制器可以處理哪些URL請求。
請求方式:
@GetMapping 通常注解查詢方法
@PostMapping 通常注解增添保存方法
@DeleteMapping 通常注解刪除方法
@PutMapping 通常注解更新方法
@PatchMapping 通常注解更新局部方法
動態(tài)賦值注解
@PathVariable 接收的url動態(tài)傳給被注解的參數(shù)(restFull風(fēng)格)
@RequestBody 將接收的json格式的數(shù)據(jù)轉(zhuǎn)為java對象參數(shù)(適用于post請求)
@RequestParam(value=“接收的xxx”) 講接收的xxx傳給被注解的參數(shù) (適用于post,get請求)
緩存注解
@EnableCaching 啟動springboot工程中的內(nèi)置緩存。
@Cacheable(value=“緩存值取名”) 把返回值進(jìn)行緩存,緩存通過切面自動切入,可用用于方法或者類上。
| 參數(shù) | 描述 |
|---|---|
| value | 名稱 |
| key | key |
| condition | 可判斷key條件 |
@CacheEvict(value=“需要清空的緩存名”) 方法是一個(gè)清緩存的切入點(diǎn)方法,當(dāng)這個(gè)方法被調(diào)用后,即會清空緩存。
| 參數(shù) | 描述 |
|---|---|
| value | 名稱 |
| key | key |
| condition | 緩存的條件,可以為空 |
| allEntries | 是否清空所有緩存內(nèi)容 |
| beforeInvocation | 是否在方法執(zhí)行前就清空 |
三,AOP切面注解
@Pointcut("@annotation(被切入方法的地址)") 設(shè)置切入點(diǎn)
@Before(“pointCut()”) 在切點(diǎn)方法前執(zhí)行
@After(“pointCut()”) 在切點(diǎn)方法后執(zhí)行
@Around(“pointCut()”) 在切點(diǎn)方法外環(huán)繞執(zhí)行,需要執(zhí)行ProceedingJoinPoint對象的proceed方法來加載需要切入的方法。
四,常用插件注解
Lombok 插件
@Data 動態(tài)添加get/set/toString/equals/hashcode/構(gòu)造方法 適用于pojo / VO該注解等同于:
@Getter + @Setter + ToString + @EqualsAndHashCode + @RequiredArgsConstructor
@Value 把所有的變量都設(shè)成 final 修飾 和 @Data相似
@AllArgsConstructor 添加構(gòu)造方法
@NoArgsConstructor 添加無參構(gòu)造
@sfl4g 自動生成該類的 log 靜態(tài)常量
@Accessors(chain = true) 引用鏈?zhǔn)郊虞d方式 方便做插入操作。
Lombok插件 官方文檔說明:
https://projectlombok.org/
MybatisPlus 注解
MyBatis-Plus (opens new window)(簡稱 MP)是一個(gè) MyBatis (opens new window) 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生。
@TableName(value="", resultMap="") 表名與實(shí)體類名不一致時(shí) 需要在實(shí)體類上加入注解"value=表名",xml 中 resultMap 的 id 不一致時(shí)需要賦值。
@TableId(value= “”, type = IdType.AUTO) 表示主鍵名/屬性。@IdType的值有:
AUTO 數(shù)據(jù)庫自增
INPUT 自行輸入
ID_WORKER 分布式全局唯一ID 長整型類型
UUID 32位UUID字符串
NONE 無狀態(tài)
ID_WORKER_STR 分布式全局唯一ID 字符串類型
@TableField("…") 注解新增屬性,如果字段名與屬性一致(已開啟駝峰規(guī)則),則可省略,否則加入"exist=false"參數(shù)。V
| 參數(shù) | 描述 |
|---|---|
| value | 字段值,如果字段名與屬性一致(已開啟駝峰規(guī)則)則可省略 |
| update | 預(yù)處理 set 字段自定義注入 |
| condition | 預(yù)處理 WHERE 實(shí)體條件自定義運(yùn)算規(guī)則 |
| exist | 是否為數(shù)據(jù)庫表字段 |
| fill | 字段填充 |
@TableLogic 表字段邏輯處理注解(邏輯刪除)
Mybatis-Plus官方文檔說明:
https://mp.baomidou.com/guide/annotation.html
Shiro 注解
Shiro 提供了相應(yīng)的注解用于權(quán)限控制,如果使用這些注解就需要使用AOP 的功能來進(jìn)行判斷
@RequiresAuthentication 表示當(dāng)前Subject已經(jīng)通過login 進(jìn)行了身份驗(yàn)證,即Subject. isAuthenticated()返回true。
@RequiresGuest 表示當(dāng)前Subject沒有身份驗(yàn)證或通過記住我登錄過,即是游客身份。
@RequiresUser 表示當(dāng)前Subject已經(jīng)身份驗(yàn)證或者通過記住我登錄的。
@RequiresRoles(value={“admin”, “user”}, logical= Logical.AND)表示當(dāng)前Subject需要角色 admin 和(AND) user ,value表示需要判斷的角色,logical表示判斷條件。
@RequiresPermissions(value={“user:a”, “user:b”}, logical= Logical.OR)
表示當(dāng)前Subject需要權(quán)限 user:a 或(OR) user:b ,value表示需要判斷的權(quán)限,logical表示判斷條件。
Shiro框架 官方文檔說明:
http://shiro.apache.org/#
五,其他注解
Async異步注解
@Async 注解描述的方法為一個(gè)異步切入點(diǎn)方法(聲明該方法執(zhí)行異步),啟動類上需要加上@EnableAsync才能使其生效。
這個(gè)方法會在切面通知方法中通過一個(gè)新的線程調(diào)用執(zhí)行,由spring線程池提供。@EnableAsync 可以使用多線程 描述該類支持異步
注釋注解
@param Dao層(Mapper)的注解,作用是用于傳遞多個(gè)參數(shù)
@return 說明該方法有返回值。只是起到一個(gè)說明作用
其他注解
不同的的業(yè)務(wù)文件放在不同的配置文件yml中,所以需要?jiǎng)討B(tài)加載配置文件@PropertySource(value=“classpath:/…”,ebcidubg=“UTF-8”) 動態(tài)加載配置文件 為了給定義的變量賦值
@Select("…") 簡單的sql語句可以用該注解直接在方法上描述
@CrossOrigin 此注解描述的Controller,表示允許跨域訪問

產(chǎn)品經(jīng)理 VS 項(xiàng)目經(jīng)理 = 親媽 VS 奶媽
對于注冊中心,ZooKeeper、Eureka 哪個(gè)更合適?
以上,便是今天的分享,希望大家喜歡,覺得內(nèi)容不錯(cuò)的,歡迎「分享」「贊」或者點(diǎn)擊「在看」支持,謝謝各位。
