JAVA中的經常使用註解---學習中持續更新--望指正

註解知識回顧

第一:分類

(1)jdk自帶的註解(5個):經常使用的就一個:@Override
(2)元註解(5個):經常使用的兩個:@Target(指定註解使用的位置) @Retention(描述生命週期)
(3)自定義註解:(框架裏都是)web

第二:元註解

@Target 指定其餘註解可使用的位置(包上、類上、方法上、屬性上)
    @Retention 指定其餘註解的生命週期(源文件中、運行時、class文件中)

第三:自定義註解

自定義註解須要配合元註解使用(經常使用@Target&@Retention )

第四:@Target註解(指定其餘註解可使用的位置)

(1)其餘註解使用在單個位置(如何指定?)
    @Target(ElementType.Type)
(2)其餘註解使用在多個位置(如何指定?)底層維護的是一個數組
    @Target({ElementType.Type,ElementType.Field}) 
 (3)@Target註解的取值{值被維護在ElementType中}
        ElementType.Type
        ElementType.Field
        ElementType.Method

第五:@Retention註解(指定其餘註解的生命週期)

@Retention註解的取值{值被維護在RetentionPolicy工具類中}
        RetentionPolicy.SOURCE
        RetentionPolicy.CLASS
        RetentionPolicy.RUNTIME

第六:自定義註解闡述

(1)定義:        
          @inteface 註解名{}
(2)配合元註解,指定自定義註解使用的位置,以及自定義註解的生命週期

第七:給註解添加功能---屬性(也有人稱爲方法)

定義(1):ajax

@inteface Annotation{
        String name();
    //String name() default "lisi";//給name賦默認值lisi
    }

使用(1):spring

@Annotation(name="zhangsan")
        public void sayhello(){
    
    }

定義(2):sql

@inteface Test{
        int value();
        //int value() default 10;//給value賦默認值10
    }

使用(2):json

@Test(value=100)
        public void sayhello(){    
     }
因爲value的特殊性,在使用註解時,能夠省略「value=」,例如@Test(100)
若是想直接使用@Test不寫值100,能夠在定義註解時,設置value的默認值爲100
@inteface Test{
   int value() default 100;//給value賦默認值100
}

問題分析:後端

@inteface Test{
    String name() default "lisi";//給name賦默認值lisi
    int value() default 100;//給value賦默認值100
}

(1)能夠直接使用這個註解,直接寫@Test
(2)保留name的默認值,改value的值(「value=」可省略)數組

@Test(10)

(3)保留value的默認值,改name的值(「value=」可省略)springboot

@Test(name=」張三「)

(4)同時改兩個值時(「value=」不能省略)restful

@Test(name=」張三「,value=10)

第八:框架(framework)中經常使用的註解

(1)@SpringBootApplicaton
描述SpringBoot工程啓動類的特定註解
(2)@SpringBootTest
描述SpringBoot工程測試類的特定註解
(3)@AutoWired
自動裝配-由Spring框架爲咱們指定的屬性類型注入值.咱們經常使用接口類型的變量來接收spring框架注入的值(多態的思想,爲了下降耦合,讓程序更容易維護)
具體的注入(DI)過程:
@AutoWired
                Student student;
                屬性的類型 屬性名

(1)第一:(Student爲一個類)spring框架會基於屬性的類型的首字母小寫(student)做爲key去bean池(單例)中(多例用的時候才建立)去尋找對應的value(這個value就是對象),在注入給這個屬性名(注入的實際上是一個地址而並不是對象);
(2)第二:(Student爲接口類型)若該實現類只有一個,則直接注入;
(3)第三:若該接口的實現類有多個,此時會根據屬性名student,去查找對應的實現類建立的對象(這個對象存在map中的key爲類名首字母小寫),找到直接注入,找不到就直接拋異常:NoUniqueBeanDefinitionException
解決辦法兩種:(通常開發中都不推薦)mybatis

方法1:修改bean的名字(默認是類名首字母小寫);@Component  (「指定的名字」),這個指定的名字必須與咱們要注入的屬性名一摸同樣;
方法2:修改屬性名(改爲某個實現類的類名首字母小寫);

經常使用方法就是指定用哪一個實現類!使用( @Qualifier 註解)

(4)@Component
不明確這個類屬於哪層時能夠用該註解,將該類 的實 列交給spring容器建立
(5)@Controller
該註解用於描述控制層,將控制層的實例建立權限 交給spring容器
返回的是view
(6)@Service
該註解用於描述業務層,由spring來建立@Service 描述的類的實例
(7)@Lazy
該註解用於延遲對象的建立,在springboot項目中,對於 單例對象默認在項目啓動時建立,這樣會耗時耗資源-單例對象是要存 到bean池中的,一般配合[@Scope(singleton)]註解使用,對於 @Scope("prototype")描述的類的對象就是在須要時建立,按需加 載,故@Lazy註解對多利做用域對象不起做用
(8)@Scope
有兩個取值@Scope("prototype")、 @Scope("singleton")
(9)@Test

(單元測試的註解)

知足如下條件
(1)訪問修飾符不能爲private
(2)返回值必須爲void
(3)方法參數必須時無參
(4)測試方法容許拋出異常

擴展----測試的第二種方法(CommandLineRunner)
在啓動類(@SpringBootApplicaton)中實現這個接口,重寫 run()方法,在run()方法中寫咱們測試代碼;當啓動類啓動時會自動執行run()方法

(10)@Bean

一般用於配置類中,與@Configuration配合使用
@Bean描述的方法的返回值(返回的是一個對象)交給spring去 管理。此時能夠配合@Lazy註解使用

(11)@Mapper
添加在數據層的接口上,通知spring,該接口的實現類有mybatis負責實現,該實現類的對象有mybatis建立,可是交給spring管理
(12)@Repository
添加在數據層接口的實現類上,將這個類交給Spring管理
(13)@param
當mybatis版本相對較低時,在動態sql中想要使用方法中的參數變量來獲取數據,就須要使用該註解對參數變量進行描述
也與jdk的版本有關
原理:mybatis中規範,默認條件下能夠進行但值傳遞 後端用任意的參數接收均可以,
有時可能進行多值傳遞,會將多值封裝爲map集合進行參數的傳遞
舊版本時若是須要封裝爲單值,則必須添加param
新版本時能夠自動添加@param,前提條件是多值傳遞
單值:數組 collection=「array」
單值:集合 collection=「list」
多值:利用@param註解封裝 collection=「key」
(14)@ReponseBody
1.描述的方法的返回值不是view(不是一個頁面),
2.好比說能夠是一個字符串String---直接返回該字符串
3.當方法的返回值是一個或多個pojo對象(也能夠是map)時,springmvc去查看這個方法上是否有該註解,如有,就會pojo對象轉成JSON格式的字符串(字符串數組)
(15)@RestController
@Controller+@ReponseBody
通常適用於ajax,不走視圖解析器,而且返回json數據
(16)@PathVariable
當咱們的方法參數要從url中獲取參數時,就須要使用該註解--restful風格中經常使用!
若是url中的名字與方法參數名不一致,還能夠指定
url="menu/menulist"

1.url中的名字與方法參數名一致,能夠直接加上@PathVariable,不用指定別名
@RequestMapping("{do}/{dolist}")
public String domain(@PathVariable String dolist){
return dolist;
}

@RequestMapping("{do}/{dolist}")
public String domain(@PathVariable String do){
return do;
}

* * *

2.url中的名字與方法參數名不一致,還能夠指定,代表方法參數中的變量時來自url中的哪個
(通常不用這樣的,直接寫成同樣就能夠了(第一種))
@RequestMapping("{do}/{dolist}")
public String domain(@PathVariable("dolist")String name){
return name;
}
@RequestMapping("{do}/{dolist}")
public String domain(@PathVariable("do")String name){
return name;
}
(17)@RequestMapping
請求映射-提供映射路徑-可使用在類上、方法上
(18)@ControllerAdvice
該註解描述類爲全局異常處理類
當Spring mvc(web)的控制層出現異常,首先會檢查controller中是否有對應的異常處理方法,有則直接執行,若沒有,就會檢索是否有@ControllerAdvice描述的類,如有,則再去檢索類中是否有對應的異常處理方法。。
(19)@ExceptionHandler
該註解描述的方法,爲一個異常處理的方法,註解中須要指定能處理的異常類型(RuntimException.class-字節碼對象),表示該方法可以處理該類型的異常以及子類異常。 在異常處理方法中,一般須要一個異常參數,用來接收異常對象。 方法的返回值一般是一個對象(json格式-知足響應式佈局),一般與@ReponseBody註解結合使用
相關文章
相關標籤/搜索