由于項(xiàng)目使用了spring boot,所以經(jīng)常需要使用spring的一些注解來(lái)簡(jiǎn)化代碼和配置,以下羅列一些平時(shí)工作中使用的注解
@Autowired
此注解的作用是把對(duì)應(yīng)的服務(wù)類(lèi)根據(jù)類(lèi)型byType注入到Spring容器中
@Resource
此注解并不是spring的它掂,而是j2ee的迈窟,但是spring也支持此注解剧蚣,這個(gè)注解注入的方式和@Autowired不一樣的地方是這個(gè)是根據(jù)名稱(chēng)byName來(lái)實(shí)現(xiàn)的
@RequestMapping
根據(jù)Spring MVC架構(gòu)俱诸,需要把對(duì)應(yīng)的http請(qǐng)求映射到對(duì)應(yīng)的控制器上十电,這時(shí)候就需要用到這個(gè)注解了绿鸣,
主要作用是配置url映射,當(dāng)控制器在類(lèi)級(jí)別上添加@RequestMapping注解時(shí)栽燕,這個(gè)注解會(huì)應(yīng)用到控制器的所有處理器方法上罕袋。處理器方法上的@RequestMapping注解會(huì)對(duì)類(lèi)級(jí)別上的@RequestMapping的聲明進(jìn)行補(bǔ)充。
@Controller? ? ??@Controller 用來(lái)響應(yīng)頁(yè)面纫谅,必須配合模版來(lái)使用
@RestController? ?@RestController是@ResponseBody和@Controller的組合注解炫贤。
?@RolesAllowed 表示訪(fǎng)問(wèn)對(duì)應(yīng)方法時(shí)所應(yīng)該具有的角色溅固,使用前需要導(dǎo)入Jsr-250-api依賴(lài),開(kāi)啟注解?
@Async 作用在方法上付秕,表示此方法和方法的調(diào)用者之間是異步的,即調(diào)用此方法的方法不需要等這個(gè)方法執(zhí)行完畢再執(zhí)行之后的代碼
@ApiOperation? ?這個(gè)注解并不是Spring的侍郭,它是swagger里的注解询吴,但是這個(gè)注解配合Spring可以很好的解決一個(gè)問(wèn)題,就是用來(lái)構(gòu)建API接口文檔的亮元,具體的使用方式是@ApiOperation(value = “接口說(shuō)明”, httpMethod = “接口請(qǐng)求方式”, response = “接口返回參數(shù)類(lèi)型”, notes = “接口發(fā)布說(shuō)明”猛计;)等
@Deprecated? 這個(gè)也是jdk自帶的注解,主要作用就是表明這個(gè)方法或者類(lèi)已經(jīng)廢棄爆捞,
@Around
@Bean
@Before
@After
注解的實(shí)現(xiàn)原理
首先我們需要了解Java為我們提供的元注解和相關(guān)定義注解的語(yǔ)法奉瘤,舉例如下@Target({ElementType.METHOD})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Demo {
boolean value()default true;
}
注解的實(shí)現(xiàn)都是使用@interface 類(lèi)似于我們的class 和interface
jdk定義了四個(gè)使用在注解上的注解來(lái)實(shí)現(xiàn)其他定義的注解,你可以把這四個(gè)注解理解為基礎(chǔ)注解煮甥,不需要你考慮盗温,jdk定義的四個(gè)注解分別為1.@Target,? 2.@Retention,? 3.@Documented,? 4.@Inherited
1: @Target
作用:用于描述注解的使用范圍(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述構(gòu)造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部變量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述參數(shù)
7.TYPE:用于描述類(lèi)、接口(包括注解類(lèi)型) 或enum聲明
比如我們上面舉的例子demo中就是表示demo注解可以使用在方法上
2:@Retention
作用:表示需要在什么級(jí)別保存該注釋信息成肘,用于描述注解的生命周期(即:被描述的注解在什么范圍內(nèi)有效)
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留)
一般而言卖局,我們的注解都是使用RUNTIME運(yùn)行時(shí)有效
3:@Document
用于描述其它類(lèi)型的annotation應(yīng)該被作為被標(biāo)注的程序成員的公共API,因此可以被例如javadoc此類(lèi)的工具文檔化双霍。Documented是一個(gè)標(biāo)記注解砚偶,沒(méi)有成員。
注解是根據(jù)Spring的aop原理來(lái)實(shí)現(xiàn)的洒闸,aop的原理又是基于java的動(dòng)態(tài)代理和cglib(基于字節(jié)碼)的包來(lái)實(shí)現(xiàn)
一般定義完一個(gè)注解后染坯,需要實(shí)現(xiàn)注解的功能,就需要新增一個(gè)類(lèi)專(zhuān)門(mén)去實(shí)現(xiàn)這個(gè)注解的功能了
類(lèi)名一般和注解名一樣丘逸,也可以在注解名后面寫(xiě)上Aspect
定義好類(lèi)之后单鹿,怎么把注解和對(duì)應(yīng)的類(lèi)進(jìn)行關(guān)聯(lián)呢,我們就需要定義一個(gè)切點(diǎn)方法(因?yàn)槲覀冎雷⒔獗旧砭褪腔赟pring的aop原理來(lái)實(shí)現(xiàn)的)
所以先定義好一個(gè)切點(diǎn)方法
public void point(){
? ??
},在這個(gè)方法上使用spring自帶的切點(diǎn)注解來(lái)和實(shí)現(xiàn)類(lèi)和注解的關(guān)聯(lián)
@Point("@annotation(com.xidian.haitang.annotations.Demo)")
public void point(){
}
這樣我們就可以利用spring的aop原理和自帶的注解來(lái)實(shí)現(xiàn)具體功能了鸣个,例如
@Before("point")
@After("point")
@Around("point()")
這樣就是一個(gè)自定義的注解了羞反。