SSM/springboot註解總結

註解知識回顧web

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

第二:元註解spring

@Target 指定其餘註解可使用的位置(包上、類上、方法上、屬性上)表示當前註解對誰有效  對類有效
@Retention 指定其餘註解的生命週期(源文件中、運行時、class文件中),註解何時生效  運行期有效
@Documented 表示將該註解描述的註解內部的註釋部分,也生成到相應的API中  是否動態的生成文檔信息
@Inherited 表示該註解能夠被繼承

第三:自定義註解
自定義註解須要配合元註解使用(經常使用@Target&@Retention )
第四:@Target註解(指定其餘註解可使用的位置)
(1)其餘註解使用在單個位置(如何指定?)sql

@Target(ElementType.Type)

(2)其餘註解使用在多個位置(如何指定?)底層維護的是一個數組數據庫

@Target({ElementType.Type,ElementType.Field})

(3)@Target註解的取值{值被維護在ElementType中}json

ElementType.Type
    ElementType.Field
    ElementType.Method

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

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

第六:自定義註解闡述
(1)定義:數組

@inteface 註解名{}

(2)配合元註解,指定自定義註解使用的位置,以及自定義註解的生命週期
第七:給註解添加功能---屬性(也有人稱爲方法)
定義(1):緩存

@inteface Annotation{
    String name();  //沒有設置默認值,使用該註解時,該屬性必須添加值。
//String name() default "lisi";//給name賦默認值lisi,設置了默認值後,使用該註解不須要手動設置name的屬性值。
}

使用(1):springboot

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

}

定義(2):

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

使用(2):

@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=」可省略)

@Test(name="張三")
(4)同時改兩個值時("value="不能省略)

@Test(name="張三",value=10)
第八:框架(framework)中經常使用的註解
(1)@SpringBootApplication
描述SpringBoot工程啓動類的特定註解
(2)@SpringBootTest
描述SpringBoot工程測試類的特定註解
使用條件:若是須要在測試類中,引入spring容器機制,這是纔是用該註解,不然不必加。
引入spring容器機制:好比說,咱們要在測試類中,經過spring容器來注入某個類的實例時,就須要使用該註解。
(3)@AutoWired
自動裝配-由Spring框架爲咱們指定的屬性類型注入值.咱們經常使用接口類型的變量來接收spring框架注入的值(多態的思想,爲了下降耦合,讓程序更容易維護)
具體的注入(DI)過程:

@AutoWired
            Student student;
            屬性的類型 屬性名

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

方法1:修改bean的名字(默認是類名首字母小寫);@Component (「指定的名字」),這個指定的名字必須與咱們要注入的屬性名一摸同樣;
方法2:修改屬性名(改爲某個實現類的類名首字母小寫);
經常使用方法就是指定用哪一個實現類!使用( @Qualifier 註解)
@AutoWired(required=false)在項目啓動的第一時間,能夠不注入值(能注入則注入,不能注入則跳過)。
與@Resource註解裝配過程區分,參見@Resource註解(位置:第47個註解)

(4)
@Component

不明確這個類屬於哪層時能夠用該註解,將該類 的實 例交給spring容器建立

加:@ComponentScan說明:經過該註解能夠指定哪些包中的對象交給spring容器管理

加:@ComponentScan(excludeFilters = { // 掃描路徑設置(具體使用待確認)

加:@Configuration:描述該註解是一個配置類|配置文件

加:@SpringBootConfiguration:該註解表示了主啓動類,說明主啓動類也是一個配置類|配置文件

加:@AutoConfigurationPackage:自動配置的包掃描 動態獲取當前主啓動類的包路徑
注意事項:之後寫代碼的時候,必定要在主啓動類的同包及子包中編輯

加:@Import(AutoConfigurationImportSelector.class)
:說明:springBoot程序中有多個選擇器,在程序啓動時springBoot會調用選擇器去加載pom.xml文件中的啓動項(SpringBoot-statr-xxxx)等jar包文件,若是選擇器匹配則開始運行實例化對象,若是不匹配則跳過該選擇器,執行下一個。至此整個開箱即用的原則實現

加:請具體瞭解springboot的啓動過程(CSDN 百度)

加:開箱即用的核心:@EnableAutoConfiguration:此註解顧名思義是能夠自動配置,開啓springboot的註解功能,springboot的四大神器之一,其藉助@Import的幫助

加:@PropertySource("value=classpath:/"):意思就是程序運行時,咱們要加載指定的配置文件

加:@Accessors(chain = true) //鏈式加載

加:@TableName("")//定義代表與對象之間的關係
加:@TableId(type = IdType.AUTO)//主鍵自增
加:@TableField("name")//字段映射 若是名稱相同,則能夠省略不寫


(5)@Controller
該註解用於描述控制層,將控制層的實例建立權限 交給spring容器
返回的是view
(6)@Service
該註解用於描述業務層,由spring來建立@Service 描述的類的實例
加: @Mapper
將結構交給Mybatis管理,以後統一交給spring管理
(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)@MapperScan("接口文件的包名")
添加在主啓動類上,利用包掃描的方式,爲指定包下的接口建立代理類以及代理對象並交給spring管理
優點:不用在每一個映射的接口上使用@Mapper註解了
前提:要將全部的映射文件放在同一個包下。
(13)@Repository
添加在數據層接口的實現類上,將這個類交給Spring管理
(14)@Param
當mybatis版本相對較低時,在動態sql中想要使用方法中的參數變量來獲取數據,就須要使用該註解對參數變量進行描述
也與jdk的版本有關(往下看~~~~)
原理:mybatis中規定,默認條件下能夠進行單值傳遞 後端用任意的參數接收均可以。
有時候可能進行多值傳遞,須要將多值封裝爲map集合進行參數的傳遞(sql中經過key來取值)
舊版本時若是須要封裝爲單值,則必須添加@Param註解
新版本時能夠自動添加@param,前提條件是多值傳遞
單值:數組 collection="array" (mapper層傳的是數組,此時數組就是一個單值,此時xml中的collection="array")
單值:集合 collection="list" (mapper層傳的是list集合,此時數組就是一個單值,此時xml中的collection="list")
多值:利用@param註解封裝 collection="key"(mapper層傳的是map,此時這個map就是一個單值,此時xml中的collection="key")
(15)@ReponseBody
1.描述的方法的返回值不是view(不是一個頁面),
2.好比說能夠是一個字符串String---直接返回該字符串
3.當方法的返回值是一個或多個pojo對象(也能夠是map)時,springmvc去查看這個方法上是否有該註解,如有,就會pojo對象轉成JSON格式的字符串(字符串數組)
4.表示程序結束
5.不會執行視圖解析器配置
(16)@RestController
@Controller+@ReponseBody
通常適用於ajax,不走視圖解析器,而且返回json數據
(17)@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;
}
(18)@RequestMapping
請求映射-提供映射路徑-可使用在類上、方法上
(19)@ControllerAdvice
該註解描述類爲全局異常處理類
當Spring mvc(web)的控制層出現異常,首先會檢查controller中是否有對應的異常處理方法,有則直接執行,若沒有,就會檢索是否有@ControllerAdvice描述的類,如有,則再去檢索類中是否有對應的異常處理方法。。
(20)@ExceptionHandler
該註解描述的方法,爲一個異常處理的方法,註解中須要指定能處理的異常類型(RuntimException.class-字節碼對象),表示該方法可以處理該類型的異常以及子類異常。
在異常處理方法中,一般須要一個異常參數,用來接收異常對象。
方法的返回值一般是一個對象(json格式-知足響應式佈局),一般與@ReponseBody註解結合使用
(21)@Aspect
該註解描述的類爲一個切面(aop)

(22)@Around(環繞通知)優先級最高
執行目標方法以前Spring會檢測是否有切面(@Aspect描述的類),而後檢測是否有通知方法(@Around註解描述的方法),有該方法則執行該方法,在方法中調用經過ProceedingJoinPoint對象jp調用proceed()方法(該方法會執行目標方法)

(23)@Before
當@Around註解描述的方法中,要執行目標方法以前(proceed方法執行以前),執行該註解描述的方法

(24)@After
目標方法執行以後,執行此註解描述的方法(若是目標方法有異常該方法不執行)

(25)@AfterReturnning
@After註解描述的方法執行以後,(這個方法執行了,說明目標方法沒有拋出異常)執行該註解描述的方法。

(26)@AfterThrowing
@Around註解描述的方法中的目標方法執行時拋出異常了,就直接執行該註解描述的方法。

(27)@Slf4j(lombok中)
應用在類上,此類中就可使用log對象
就至關於在這個類中添加了一行以下代碼

Logger log=LoggerFactory.getLogger(類名.class);
(28)@PointCut
該註解用來定義切入點方法

@Pointcut("bean(sysUserServiceImpl)")

public void logPointCut() {}
切入點表示有四種:
bean execution within @annocation

(29)@Order(1)
該註解用於指定切面的優先級,數字越小,優先級越高,默認值是整數的最大值即默認值的優先級是最低的

(30)@Transactional
該註解能夠描述類和方法,
當描述類時,表示類中的全部方法在執行以前開啓事務,方法執行以後結束事務。
當描述方法時,表示該方法在執行以前開啓事務,方法執行以後結束事務。
優先級問題:當類上和方法上都有該註解時,方法上的優先級高於類上的。
該註解中的屬性也很重要:
timeout:設置超時時間
isolation:設置隔離級別
rollbackfor:當遇到什麼異常以及子類異常時要執行回滾操做。
read-only:指定事務是否爲只讀事務,默認值爲 false;爲了忽略那些不須要事務的方法,好比讀取數據,能夠設置read-only爲true。對添加,修改,刪除業務read-only的值應該爲false。
propagation:
Propagation.REQUIRED(若是沒有事務建立新事務, 若是當前有事務參與當前事務, Spring 默認的事務傳播行爲是PROPAGATION_REQUIRED,它適合於絕大多數的狀況。)
Propagation.REQUIRES_NEW
若是有當前事務, 掛起當前事務而且開啓新事務

(31)@EnableAsync
註解應用到啓動類上,表示開啓異步,spring容器啓動時會建立線程池
spring中線程池的配置:

spring:

task:
    execution:
      pool:
        queue-capacity: 128
        core-size: 5
        max-size: 128
        keep-alive: 60000
        thread-name-prefix: db-service-task-

(32)@Async
在須要異步執行的業務方法上,使用@Async方法進行異步聲明。

說明:AsyncResult對象能夠對異步方法的執行結果進行封裝,假如外界須要異步方法結果時,能夠經過Future對象的get方法獲取結果。
爲了簡便某些狀況下,咱們能夠將方法的返回值寫成void,這樣就不要這麼複雜的封裝(前提時方法的返回值咱們不使用)。

@Transactional(propagation = Propagation.REQUIRES_NEW)
@Async
@Override
public Future<Integer> saveObject(SysLog entity) {
System.out.println("SysLogServiceImpl.save:"+
Thread._currentThread_().getName());
int rows=sysLogDao.insertObject(entity);
//try{Thread._sleep_(5000);}catch(Exception e) {}
return new AsyncResult<Integer>(rows);

}
(33)@EnableCaching
在項目(SpringBoot項目)的啓動類上添加@EnableCaching註解,以啓動緩存配置。

在須要進行緩存的業務方法上經過@Cacheable註解對方法進行相關描述.表示方法的
返回值要存儲到Cache中,假如在更新操做時須要將cache中的數據移除,能夠在更新方法上使用@CacheEvict註解對方法進行描述。
@Cacheable(value = "menuCache")
@Transactional(readOnly = true)
public List<Map<String,Object>> findObjects() {
....
}
value屬性的值表示要使用的緩存對象,名字本身指定,其中底層爲一個map對象,當向cache中添加數據時,key默認爲方法實際參數的組合。
(34)@Value
說明:該註解單獨使用(不配合@PropertySource註解)時,此時配置文件已經被加載到spring容器中,表示從spring容器(加載的配置文件)中取值。
該註解配合@PropertySource註解使用時,能夠從指定的配置文件中取值,value屬性指定配置文件的所在路徑@PropertySource(value="classpath:/properties/image.properties",encoding="utf-8")
該註解用於描述屬性的值,能夠用來取出配置文件中的value值(根據key來取值)(properties、yml)、
properties配置文件的優先級高於yml配置文件的優先級
當這兩個文件中都用同一個屬性時,優先讀取properties配置文件中的,而後讀取yml配置文件中的,全部最後獲得的是yml>中的(key相同值被覆蓋)。
@value(「${server.port}」)
private String port;
說明:
由於配置文件中的value值都是字符串類型,因此這裏須要用String類型接收。
該註解配合spel表達式取出配置文件中對應key的值。
(35)@PropertySource(value="classpath:/properties/image.properties",encoding="utf-8")
當配置文件已經被加載到spring容器中了,就不要使用該註解指明加載的配置文件了,容器中有直接用@Value取值便可。
說明:該註解用於類上,做用:讀取指定位置的配置文件信息,加載該文件到spring容器中
value屬性用來指定配置文件的路徑
classpath:/ 指定類目錄下的路徑(resource目錄下)
encoding:用來指定配置文件的編碼類型
@PropertySource(value="classpath:/properties/image.properties",encoding="utf-8")
public class ReadProperties{

}
(36)@Data(lombok)
該註解用在pojo類上,做用是生成對應的get/set/toString...方法
toString()方法只會重寫本身的屬性,不會添加父類的屬性。
(37)@Setter(lombok)
該註解用在pojo類上,生成set方法
(38)@Getter(lombok)
該註解用在pojo類上,生成get方法
(39)@NoArgsConstructor(lombok)
該註解用在pojo類上,生成無參的構造方法
(40)@NoArgsConstructor(lombok)
該註解用在pojo類上,生成全參的構造方法
(41)@Accessors(chain=true)(lombok提供)
提供鏈式加載(對於set方法)
User user=new User();
user.setName("張三").setAge(26).setScore(98);
(42)@TableName(「表名」)(mybatisplus提供)
該註解用在pojo類上,用來指定該類的對象,與數據庫中的哪張表映射
當pojo類名忽略大小寫時,與數據庫中要映射的表名一致時,能夠不指定表名。如直接寫@TableName註解便可。但不能省略這個註解。
(43)@TableId(type=IdType.Auto)(mybatisplus提供)
該註解用於pojo類中的屬性上,用來指定表中的主鍵要映射到pojo類中的哪一個屬性。
(44)@TableField(value="字段名")(mybatisplus提供)
@TableField(fill = FieldFill.INSERT)指定哪一個屬性,在新增時有效,通常是建立時間
@TableField(fill = FieldFill.INSERT_UPDATE)指定哪一個屬性,在新增和修改時有效,通常是建立時間/修改時間
該註解用於pojo類中的屬性上,用來指定表中的字段(除主鍵外的其餘字段)映射到pojo類中的哪一個屬性。
當字段名與屬性名一致時,或者,駝峯命名後字段名與屬性名一致時,能夠省略這個註解@TableField,即pojo中的屬性上不寫該註解。
(45)@GetMapping("/page/{moduleName}")
該註解用來處理查詢請求,其餘請求無效。
該註解至關於
@RequestMapping(value="/page/{moduleName}",method=RequestMethod.GET)
restful風格:能夠根據請求的方式,來執行特定的業務功能。
TYPE=GET 處理查詢業務
TYPE=POST 處理新增業務
TYPE=PUT 處理修改業務
TYPE=DELETE 處理刪除業務
result風格總結:
1.能夠獲取url中的參數配合@PathVariable註解
2.根據請求方式,執行特定的業務功能
(46)@RestControllerAdvice
@RestControllerAdvide=@ResponseBody+@ControllerAdvide
說明:
該註解應用於類上,表示爲通知方法。類中的方法的返回值都不是view,返回的是JSON格式的數據。
該註解描述的類爲全局異常處理類,處理Controller層出現的異常。
(47)@Resource
@Resource的做用至關於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。因此若是使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。若是既不指定name也不指定type屬性,這時將經過反射機制使用byName自動注入策略。

@Resource裝配順序

若是同時指定了name和type,則從Spring上下文中找到惟一匹配的bean進行裝配,找不到則拋出異常
若是指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
若是指定了type,則從上下文中找到類型匹配的惟一bean進行裝配,找不到或者找到多個,都會拋出異常
若是既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;若是沒有匹配,則回退爲一個原始類型進行匹配,若是匹配則自動裝配;
(48)@ComponentScan(basePackages={"包的路徑"})
掃描指定路徑下的類,看是否有類上@Component、@Controller、@Service、@Mapper等,如有則指明該類的實例由Spring容器建立。
(49)@RequestBody
一、@requestBody註解經常使用來處理content-type不是默認的application/x-www-form-urlcoded編碼的內容,好比說:application/json或者是application/xml等。通常狀況下來講經常使用其來處理application/json類型。

二、經過@requestBody能夠將請求體中的JSON字符串綁定到相應的bean上,固然,也能夠將其分別綁定到對應的字符串上。

@RequestBody和@RequestParam區別
@RequestParam
註解@RequestParam接收的參數是來自HTTP請求體或請求url的QueryString中。
RequestParam能夠接受簡單類型的屬性,也能夠接受對象類型。
@RequestParam有三個配置參數:

required 表示是否必須,默認爲 true,必須。
defaultValue 可設置請求參數的默認值。
value 爲接收url的參數名(至關於key值)。
@RequestParam
用來處理Content-Type爲application/x-www-form-urlencoded編碼的內容,Content-Type默認爲該屬性,也能夠接收???????application/json。@RequestParam也可用於其它類型的請求,例如:POST、DELETE等請求.因此在postman中,要選擇body的類型爲 x-www-form-urlencoded,這樣在headers中就自動變爲了 Content-Type : application/x-www-form-urlencoded 編碼格式。
@RequestBody
註解@RequestBody接收的參數是來自requestBody中,即請求體。通常用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數據,好比:application/json、application/xml等類型的數據。就application/json類型的數據而言,使用註解@RequestBody能夠將body裏面全部的json數據傳到後端,後端再進行解析。

GET請求中,由於沒有HttpEntity,因此@RequestBody並不適用。
POST請求中,經過HttpEntity傳遞的參數,必需要在請求頭中聲明數據的類型Content-Type,SpringMVC經過使用
HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數據,而後綁定到相應的bean上。因爲@RequestBody可用來處理 Content-Type 爲 application/json 編碼的內容,因此在postman中,選擇body的類型爲rowJSON(application/json),這樣在 Headers 中也會自動變爲 Content-Type : application/json 編碼格式。

(50)@JsonFormat在你須要查詢出來的時間的數據庫字段對應的實體類的屬性上添加@JsonFormat能夠很好的解決:後臺到前臺時間格式保持一致的問題(51)@DateTimeFormat在你須要查詢出來的時間的數據庫字段對應的實體類的屬性上添加@DataTimeFormat能夠很好的解決:前臺到後臺時間格式保持一致的問題@DateTimeFormat(pattern ="yyyy-MM-dd")@JsonFormat(pattern ="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")private Date symstarttime;(52)@TableName此註解主要是實現實現類型和數據庫中的表實現映射(用於指向數據庫的表名稱)

相關文章
相關標籤/搜索