javascript
Spring自学教程-注解的使用(三)
一、java中的注解
定義注解
下面是一個(gè)定義注解的實(shí)例。
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Description {
?String value();
}
其中的@interface是一個(gè)關(guān)鍵字,在設(shè)計(jì)annotations的時(shí)候必須把一個(gè)類(lèi)型定義為@interface,而不能用class或interface關(guān)鍵字。所有的注解類(lèi)都隱式繼承于java.lang.annotation.Annotation,注解不允許顯式繼承于其他的接口。
一個(gè)注解可以擁有多個(gè)成員,成員聲明和接口方法聲明類(lèi)似,這里,我們僅定義了一個(gè)成員,成員的聲明有以下幾點(diǎn)限制:
a)?? 成員以無(wú)入?yún)o(wú)拋出異常的方式聲明,如boolean value(String str)、boolean value() throws Exception等方式是非法的;
b)?? 可以通過(guò)default為成員指定一個(gè)默認(rèn)值,如String level() default "LOW_LEVEL"、int high() default 2是合法的,當(dāng)然也可以不指定默認(rèn)值;
c)?? 成員類(lèi)型是受限的,合法的類(lèi)型包括原始類(lèi)型及其封裝類(lèi)、String、Class、enums、注解類(lèi)型,以及上述類(lèi)型的數(shù)組類(lèi)型。如ForumService value()、List foo()是非法的。
d)?? 如果注解只有一個(gè)成員,則成員名必須取名為value(),在使用時(shí)可以忽略成員名和賦值號(hào)(=),如@Description("使用注解的實(shí)例")。注解類(lèi)擁有多個(gè)成員時(shí),如果僅對(duì)value成員進(jìn)行賦值則也可不使用賦值號(hào),如果同時(shí)對(duì)多個(gè)成員進(jìn)行賦值,則必須使用賦值號(hào),如@DeclareParents (value = "NaiveWaiter", defaultImpl = SmartSeller.class)。
e)?? 注解類(lèi)可以沒(méi)有成員,沒(méi)有成員的注解稱(chēng)為標(biāo)識(shí)注解,解釋程序以標(biāo)識(shí)注解存在與否進(jìn)行相應(yīng)的處理;
注解定義包含四個(gè)元注解,分別為@Target,@Retention,@Documented,@Inherited。各元注解的作用如下:
1)? @Target
表示該注解用于什么地方,可能的?ElemenetType?參數(shù)包括:
?? ElemenetType.CONSTRUCTOR?構(gòu)造器聲明。
?? ElemenetType.FIELD?域聲明(包括?enum?實(shí)例)。
?? ElemenetType.LOCAL_VARIABLE?局部變量聲明。
?? ElemenetType.METHOD?方法聲明。
?? ElemenetType.PACKAGE?包聲明。
?? ElemenetType.PARAMETER?參數(shù)聲明。
?? ElemenetType.TYPE?類(lèi),接口(包括注解類(lèi)型)或enum聲明。
2)? @Retention
表示在什么級(jí)別保存該注解信息。可選的?RetentionPolicy?參數(shù)包括:
?? RetentionPolicy.SOURCE?注解將被編譯器丟棄。
?? RetentionPolicy.CLASS?注解在class文件中可用,但會(huì)被VM丟棄。
?? RetentionPolicy.RUNTIME?VM將在運(yùn)行期也保留注釋,因此可以通過(guò)反射機(jī)制讀取注解的信息。
舉一個(gè)例子,如@Override里面的Retention設(shè)為SOURCE,編譯成功了就不要這一些檢查的信息,相反,@Deprecated里面的Retention設(shè)為RUNTIME,表示除了在編譯時(shí)會(huì)警告我們使用了哪個(gè)被Deprecated的方法,在執(zhí)行的時(shí)候也可以查出該方法是否被Deprecated。
3)? @Documented
將此注解包含在?javadoc?中
4)? @Inherited
允許子類(lèi)繼承父類(lèi)中的注解
二、spring中注解的使用
1、使用Spring注解來(lái)注入屬性
? ??@Resource默認(rèn)按照名稱(chēng)(name="test")進(jìn)行裝配,名稱(chēng)可以通過(guò)@resource的name屬性設(shè)定,當(dāng)找不到與名稱(chēng)匹配的bean才會(huì)按類(lèi)型裝配? ??? ??注意:如果沒(méi)有指定name屬性,并且安裝默認(rèn)的名稱(chēng)依然找不到依賴(lài)對(duì)象時(shí),@Resource會(huì)回退到按類(lèi)型裝配。但一旦指定了name屬性,就只能按名稱(chēng)裝配了。那么在類(lèi)中怎樣使用呢?
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
????????xsi:schemaLocation="http://www.springframework.org/schema/beans
????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
????????http://www.springframework.org/schema/context
????????http://www.springframework.org/schema/context/spring-context-2.5.xsd">
????????<context:annotation-config />
</beans>?在配置文件中加上<context:annotationconfig />將隱式地向Spring容器注冊(cè)AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、 PersistenceAnnotationBeanPostProcessor以及RequiredAnnotationBeanPostProcessor這4個(gè)BeanPostProcessor注解解析器,這樣的話(huà)我們就不許要在對(duì)象中使用set方法了,更方便開(kāi)發(fā)了。。。有木有
2、使用Spring注解完成Bean的定義
?以上我們介紹了通過(guò)@Autowired或@Resource來(lái)實(shí)現(xiàn)在Bean中自動(dòng)注入的功能,下面我們將介紹如何注解Bean,從而從XML配置文件中完全移除Bean定義的配置。配置文件<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"?
????xsi:schemaLocation="http://www.springframework.org/schema/beans?
????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd?
????http://www.springframework.org/schema/context?
????http://www.springframework.org/schema/context/spring-context-2.5.xsd">?
????<context:component-scan base-package="com.kedacom.ksoa" />?
</beans>??
@Component(不推薦使用)、@Repository、@Service、@Controller
只需要在對(duì)應(yīng)的類(lèi)上加上一個(gè)@Component注解,就將該類(lèi)定義為一個(gè)Bean了:
Java代碼
@Component
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
????...
}
@Component
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
????????...
}
使用@Component注解定義的Bean,默認(rèn)的名稱(chēng)(id)是小寫(xiě)開(kāi)頭的非限定類(lèi)名。如這里定義的Bean名稱(chēng)就是userDaoImpl。你也可以指定Bean的名稱(chēng):
@Component("userDao")
@Component是所有受Spring管理組件的通用形式,Spring還提供了更加細(xì)化的注解形式:@Repository、@Service、@Controller,它們分別對(duì)應(yīng)存儲(chǔ)層Bean,業(yè)務(wù)層Bean,和展示層Bean。目前版本(2.5)中,這些注解與@Component的語(yǔ)義是一樣的,完全通用,在Spring以后的版本中可能會(huì)給它們追加更多的語(yǔ)義。所以,我們推薦使用@Repository、@Service、@Controller來(lái)替代@Component。
<context:component-scan />的base-package屬性指定了需要掃描的類(lèi)包,類(lèi)包及其遞歸子包中所有的類(lèi)都會(huì)被處理。
<context:component-scan />還允許定義過(guò)濾器將基包下的某些類(lèi)納入或排除。Spring支持以下4種類(lèi)型的過(guò)濾方式:
過(guò)濾器類(lèi)型 表達(dá)式范例 說(shuō)明
注解 org.example.SomeAnnotation 將所有使用SomeAnnotation注解的類(lèi)過(guò)濾出來(lái)
類(lèi)名指定 org.example.SomeClass 過(guò)濾指定的類(lèi)
正則表達(dá)式 com\.kedacom\.spring\.annotation\.web\..* 通過(guò)正則表達(dá)式過(guò)濾一些類(lèi)
AspectJ表達(dá)式 org.example..*Service+ 通過(guò)AspectJ表達(dá)式過(guò)濾一些類(lèi)
以正則表達(dá)式為例,我列舉一個(gè)應(yīng)用實(shí)例:
Java代碼
<context:component-scan base-package="com.casheen.spring.annotation">?
????<context:exclude-filter type="regex" expression="com\.casheen\.spring\.annotation\.web\..*" />?
</context:component-scan>?
????????<context:component-scan base-package="com.casheen.spring.annotation">
????????????????<context:exclude-filter type="regex" expression="com\.casheen\.spring\.annotation\.web\..*" />
????????</context:component-scan>
值得注意的是<context:component-scan />配置項(xiàng)不但啟用了對(duì)類(lèi)包進(jìn)行掃描以實(shí)施注釋驅(qū)動(dòng)Bean定義的功能,同時(shí)還啟用了注釋驅(qū)動(dòng)自動(dòng)注入的功能(即還隱式地在內(nèi)部注冊(cè)了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor),因此當(dāng)使用<context:component-scan />后,就可以將<context:annotation-config />移除了。?
總結(jié):?
?
來(lái)自為知筆記(Wiz)
轉(zhuǎn)載于:https://www.cnblogs.com/wang3680/p/0f4eea023d8eb01b097c732fddba5725.html
總結(jié)
以上是生活随笔為你收集整理的Spring自学教程-注解的使用(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 课程改进意见
- 下一篇: Spring中DispacherServ