ava註解(Annotation)是經過在java源文件上添加標記字段,而後經過反射的反射在編譯或者運行時獲取這些標記字段以及其標記目標,而後進行相應處理的方法,曾經風靡一時的XDoclet就是最先的java註解的工做原理說明。使用註解能夠進行某些配置,大大減小xml配置文件的書寫麻煩,可是也有人認爲註解方式不方便理解和維護,所以對於註解VS XML配置文件一直爭論不斷,我的感受沒有好壞之分,合適就是最好的。java
(1).JDK內置註解:spring
JDK內置了3個註解:框架
a. @Override:聲明某個方法被重寫。ide
b. @Deprectated:聲明某個方法過期,不推薦使用。spa
c. @SuppressWarning({「unchecked」,…….}):告訴編譯器對於那些警告信息忽略。code
(2).自定義java註解:component
Java註解就是一種特殊的接口,自定java註解很是方便,簡單例子以下:orm
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.CLASS) public @interface TestAnnotation{ String value() default 「」; }
3).若要想自定義的註解能夠被繼承,則須要在自定義註解類上加上「@Inherited」註解。xml
注意和說明:對象
a. java的註解其實是自動繼承了java.lang.annotation.Annotation接口,所以在自定義註解時不能繼承其餘的註解或者接口。
b. Retention:告訴編譯器如何處理註解,即註解運行在什麼時刻。
RetentionPolicy是個枚舉類型,有如下三種狀態值:
1).SOURCE:該註解存儲在源文件中,編譯事後即廢棄。
2).CLASS:該註解存儲在class文件中,是其缺省的值。
3).RUNTIME:該註解存儲在class文件中,而且有Java虛擬機讀入解析,該類型很是重要,可使用反射機制獲取註解相關信息,能夠進行程序分析處理。
c. @Target:指定註解的目標使用對象。
ElementType也是個枚舉類型,有如下幾種狀態值:
1).TYPE:該註解適用於class,interface,enum等類級別的目標對象。
2).FIELD:該註解適用於類中字段級別的目標對象。
3).METHOD:該註解適用於類中方法級別的目標對象。
4).PARAMETER:該註解適用於方法參數級別的目標對象。
5).CONSTRUCTOR:該註解適用於類構造方法。
6).LOCAL_VARIABLE:該註解適用於局部變量。
7).ANNOTATION_TYPE:該註解適用於annotation對象。
8).PACKAGE:該註解適用於package對象。
d.註解裏面只能聲明屬性,不能聲明方法,聲明屬性的方式比較特殊:
語法格式爲:數據類型 屬性() default 默認值(默認值是可選的); 如:Stringvalue();
使用時,「註解對象(屬性=屬性值)」爲註解指定屬性值,經過「註解對象.屬性;」就能夠獲得註解屬性的值。
e.註解的解析:使用java反射機制得到註解的目標對象就能夠獲得註解對象,如:
經過反射獲得了註解目標的Field對象field,則經過「field.getAnnotation(註解類.class);」就能夠獲得註解對象。
9. 基於註解的Spring配置準備條件:
從Spring2.5之後,Spring開始全面支持註解方式配置,因此能夠不用寫xml配置文件,同樣可使用spring。
(1).使用spring註解方式,必須加入spring註解方式所依賴的jar包:common-annotation.jar。
(2).使用註解方式時,必須在spring配置文件的schema中添加註解的命名空間以下:
xmlns:context=」http://www.springframework.org/schema/context」 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
(3).在spring配置文件中註冊註解處理器:
在spring配置文件中<.bean>元素以前添加:
< context:annotation-config >
10. 基於註解的spring配置:
Spring2.5中使用四個註解按功能來進行對bean的配置:
(1).@Component:泛指組件,對於通常很差歸類的java Bean使用。
(2).@Service:用於標註配置業務層(service層)組件。
(3).@Controller:用於標註配置控制層的組件(如Struts中的action)。
(4).@Repository:用於標註配置數據訪問層組件,即通常的DAO層Bean對象。
注意:對於使用spring註解方式配置的bean對象,bean引用時默認名稱爲被註解名稱的首字母小寫形式,也能夠指定名稱,如:@Service(「userDao「)。
11. Spring的自動裝配:
自動裝配的是指不用手動顯式配置java Bean之間依賴關係,而是讓spring依據某種規則自動將合適的對象注入到目標對象的過程。Spring中經常使用@Autowire和@Resource來進行自動裝配。
(1).@Autowire:默認是按照對象的數據類型進行自動裝配的,如
@Autowire private UserDao userDao;
spring框架在運行時會自動將類型爲UserDao的對象注入進來。
(2).@Resource:默認是按照名稱或者Id進行自動裝配的,只有當找不到匹配的名稱或者Id時才按類型進行裝配,如:
@Resource(name=」userDao」) private UsreDao userDao;
spring框架在運行時會將配置名稱或者id爲「userDao」的對象注入進來。
注意:@Autowire和@Resource都既能夠寫在字段上,也能夠寫在set方法上。
12. Spring的自動掃描:
Spring自動掃描機制是指,咱們使用基於註解的spring配置方式後,spring的配置文件中只須要註冊註解處理器,不用顯式地配置Bean,當spring在運行時會自動掃描根據給定的條件下類路徑中的全部bean,根據註解將它們注入和裝配起來並進行初始化的過程。
自動掃描很簡單,只須要在spring的配置文件中添加如:
< context:component-scan base-package =「要自動掃描的包名「 >
Spring在運行時就能夠對指定的包中全部添加了Spring註解的bean自動掃描,注入,裝配和初始化。
注意:基於註解的spring配置,自動裝配和自動掃描是緊密聯繫在一塊兒協同工做的,都須要引入context的命名空間。