聲明:以下觀點,純依據個人目前的經驗和理解,有不當之處,多指教!
一、基本概述
注解(Annotation):也叫元數據。一種代碼級別的說明。它是JDK1.5及以后版本引入的一個特性,與類、接口、枚舉是在同一個層次。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。
首先,根據用途划分,可以簡單的分為元注解和一般注解,其中元注解包括四個大類:1.@Target,2.@Retention,3.@Documented,4.@Inherited。這幾個注解是用來解釋其他一般注解的。那么一般注解,就是我們常用的注解。比如:spring注解@controller等
其次,根據范圍划分(從大到小),我則把注解分為4類:1,J2EE注解;2,EJB注解;3,spring注解; 4,用戶自定義注解。其中EJB和spring的划分,我則是根據查到資料所顯示的各自可使用的范圍,據說(本人無力考證),EJB為所有主要的J2EE支持!
二、具體注解應用
再次強調說明,本文所列的幾個注解,並不是以好壞區分,而是自己最近常用的,但是在概念上有所模糊的!
1,spring的分層注解
@Controller 控制層 @Service 服務層 @Repository 持久層 @Component泛指組件,當組件不好歸類的時候,可以使用這個注解進行標注(我一般用這個注解工具類,一般!有時也單獨抽象出一個子工程負責整個工程的公共類部分)
使用Controller注解,則對應到之前的配置文件生成:
<bean id="" class="" />
2,對象注解
@Autowired:采用類型的方式完成自動裝配
@Resource:采用名稱+類型的方式完成自動裝配(比較保險)
區別是什么呢?先看下面的注入:
<pre name="code" class="java"><span style="font-family:KaiTi_GB2312;font-size:18px;"><bean id="userDao" class="cn.itcast.shop.user.dao.UserDao">
<property name="sessionFactory" ref="sessionFactory"/>
</bean></span>
在這句代碼里面,我們通過id=userDao注入了一個UserDao類,當我們在用的時候,我們通常寫:
<span style="font-family:KaiTi_GB2312;font-size:18px;">private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}</span>
不知道大家有沒有發現,我們每次寫的private UserDao userDao后面的實例名稱,總是和我們在配置文件注入的時候是一樣的(至少我有時候因為名稱不對應,結果報錯了)。采用類型和名稱的區別就在於:當采用名稱進行裝配的時候,在你用到這個實例的時候,所使用的名稱一定要相同。在注解上面則表示為:@Service(value="userService"),那么在使用這個Service的時候,則必須和這個名稱對應。它會去容器里面找userService這個名稱,然后找到這個名稱所對應的類,如果沒有,則屬性值為null。但是,如果是采用類型裝配的話,它找的就是cn.itcast.shop.user.dao.UserDao這個類。
3,@ResponseBody
spring還有很多注解,但我都不想說了。最后再說一個@ResponseBody注解(應用於controller)。這個注解是什么呢,就是當你引入了Jackson這個jar包的時候,再使用這個注解,SpringMVC就可以自動將它所修飾的方法的返回值轉換為json格式,從而不需要人為的去轉換!
PS:傳說中,這個注解加上那個jar包,可以完美的將所有Java對象轉換為json格式!
4,其他
EJB注解:說實在的,這個注解我比較少用,用到的幾次,就是使用注解,進行EJB遠程調用,不是很清楚,只是當時查的時候才知道@EJB這個東西不屬於spring的注解,我以為是。不太理解,不瞎說!
J2EE注解:如2中所示的,@Resource則屬於J2EE注解,而@Autowired則是spring提供的注解!
三、總結
事實上,我還是不太清楚,這每一種注解到底它的應用場景是什么。有時候挺迷惑的,但是,我一直在路上,總會明白的。好了,到了復制粘貼的時候了(這回粘自家人的言論),為什么使用注解呢?注解可以使我們的代碼看起來更簡潔,而且在一定程度上解除了類原有特性和擴展特性之間的耦合。
