注解
Java基礎(chǔ)加強總結(jié)(一)——注解(Annotation)
java 注解 @Retention @interface 元數(shù)據(jù)
現(xiàn)在好多代碼都是基于注解的,所以必須把這個弄清楚。今天抽空復(fù)習(xí)下。
注解(Annotation)相當(dāng)于一種標(biāo)記,在程序中加入注解就等于為程序打上某種標(biāo)記,沒有加,則等于沒有任何標(biāo)記,以后,javac編譯器、開發(fā)工具和其他程序可以通過反射來了解你的類及各種元素上有無何種標(biāo)記,看你的程序有什么標(biāo)記,就去干相應(yīng)的事,標(biāo)記可以加在包、類,屬性、方法,方法的參數(shù)以及局部變量上。
比較繞口的理解。注解就是元數(shù)據(jù),即一種描述數(shù)據(jù)的數(shù)據(jù)。所以,可以說注解就是源代碼的元數(shù)據(jù)。還不如直接說注解就是用來描述代碼的。
Annotation是一種應(yīng)用于類、方法、參數(shù)、變量、構(gòu)造器及包聲明中的特殊修飾符。它是一種由JSR-175標(biāo)準(zhǔn)選擇用來描述元數(shù)據(jù)的一種工具。
個人理解:就是內(nèi)容可以被代碼理解的注釋,一般是一個類。
- @Override告訴編譯器這個方法是一個重寫方法(描述方法的元數(shù)據(jù))
- 注解就相當(dāng)于一個你的源程序要調(diào)用一個類,在源程序中應(yīng)用某個注解,得事先準(zhǔn)備好這個注解類。就像你要調(diào)用某個類,得事先開發(fā)好這個類。
- 其實從代碼的寫法上來看,注解更像是一種特殊的接口,注解的屬性定義方式就和接口中定義方法的方式一樣,而應(yīng)用了注解的類可以認(rèn)為是實現(xiàn)了這個特殊的接口
@Target元注解的作用
@Target元注解決定了一個注解可以標(biāo)識到哪些成分上,如標(biāo)識在在類身上,或者屬性身上,或者方法身上等成分,@Target默認(rèn)值為任何元素(成分)
@@Retention元注解的作用
用來說明該注解類的生命周期。
Spring
Spring如此強大。將對象轉(zhuǎn)為json不用做其他額外的操作通過注解皆可以實現(xiàn)了。推薦看看Spring 注解學(xué)習(xí)手札(七) 補遺——@ResponseBody,@RequestBody,@PathVariable
@RequestMapping(value = "/person/profile/{id}", method = RequestMethod.GET)
public @ResponseBody
Person porfile(@PathVariable("id") int uid) {
return new Person(uid, name, status);
}
- GET模式下,這里使用了@PathVariable綁定輸入?yún)?shù),非常適合Restful風(fēng)格。因為隱藏了參數(shù)與路徑的關(guān)系,可以提升網(wǎng)站的安全性,靜態(tài)化頁面,降低惡意攻擊風(fēng)險。
- POST模式下,使用@RequestBody綁定請求對象,Spring會幫你進行協(xié)議轉(zhuǎn)換,將Json、Xml協(xié)議轉(zhuǎn)換成你需要的對象。
- @ResponseBody可以標(biāo)注任何對象,由Srping完成對象——協(xié)議的轉(zhuǎn)換。
備注:@RequestMapping(value = "/person/profile/{id}/{name}/{status}", method = RequestMethod.GET)中的{id}/{name}/{status}與@PathVariable int id, @PathVariable String name,@PathVariable boolean status一一對應(yīng),按名匹配。 這是restful式風(fēng)格。
Spring注解@Component、@Repository、@Service、@Controller區(qū)別
classpath路徑
首先 classpath是指 WEB-INF文件夾下的classes目錄
解釋classes含義:
- 1.存放各種資源配置文件 eg.init.properties log4j.properties struts.xml
- 2.存放模板文件 eg.actionerror.ftl
- 3.存放class文件對應(yīng)的是項目開發(fā)時的src目錄編譯文件
總結(jié):這是一個定位資源的入口
src不是classpath, WEB-INF/classes,lib才是classpath
WEB-INF/ 是資源目錄, 客戶端不能直接訪問,
這話是沒錯,不過現(xiàn)在的IDE編譯器在編譯時會把src下的文件(是文件,不是.java)移到WEB-INF/classes下。不過值得注意的是,spring配置文件里這個locations是uri表示,也就是說你寫的jdbc.properties是當(dāng)前相對路徑,要訪問classpath記得要這樣寫:<value>classpath:jdbc.properties</value>

Spring加載resource時classpath*:與classpath:的區(qū)別
這個困擾了我挺久的,一直沒有去弄清楚。直接看下面的圖

- classpath*:的出現(xiàn)是為了從多個jar文件中加載相同的文件.
- classpath:只能加載找到的第一個文件.