日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java注解的基本概念和原理及其简单实用

發(fā)布時(shí)間:2023/12/10 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java注解的基本概念和原理及其简单实用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?

一、注解的基本概念和原理及其簡單實(shí)用

注解(Annotation)提供了一種安全的類似注釋的機(jī)制,為我們在代碼中添加信息提供了一種形式化得方法,使我們可以在稍后某個(gè)時(shí)刻方便的使用這些數(shù)據(jù)(通過解析注解來使用這些數(shù)據(jù)),用來將任何的信息或者元數(shù)據(jù)與程序元素(類、方法、成員變量等)進(jìn)行關(guān)聯(lián)。其實(shí)就是更加直觀更加明了的說明,這些說明信息與程序業(yè)務(wù)邏輯沒有關(guān)系,并且是供指定的工具或框架使用的。Annotation像一種修飾符一樣,應(yīng)用于包、類型、構(gòu)造方法、方法、成員變量、參數(shù)及本地變量的申明語句中。

Annotation其實(shí)是一種接口。通過Java的反射機(jī)制相關(guān)的API來訪問Annotation信息。相關(guān)類(框架或工具中的類)根據(jù)這些信息來決定如何使用該程序元素或改變它們的行為。Java語言解釋器在工作時(shí)會忽略這些Annotation,因此在JVM中這些Annotation是“不起作用”的,只能通過配套的工具才能對這些Annotation類型的信息進(jìn)行訪問和處理。

?

Annotation和interface的異同:

1、?annotition的類型使用關(guān)鍵字@interface而不是interface。它繼承了java.lang.annotition.Annotition接口,并非申明了一個(gè)interface。

2、?Annotation類型、方法定義是獨(dú)特的、受限制的。Annotation類型的方法必須申明為無參數(shù)、無異常拋出的。這些方法定義了Annotation的成員:方法名稱為了成員名,而方法返回值稱為了成員的類型。而方法返回值必須為primitive類型、Class類型、枚舉類型、Annotation類型或者由前面類型之一作為元素的一位數(shù)組。方法的后面可以使用default和一個(gè)默認(rèn)數(shù)值來申明成員的默認(rèn)值,null不能作為成員的默認(rèn)值,這與我們在非Annotation類型中定義方法有很大不同。Annotation類型和他的方法不能使用Annotation類型的參數(shù),成員不能是generic。只有返回值類型是Class的方法可以在Annotation類型中使用generic,因?yàn)榇朔椒軌蛴妙愞D(zhuǎn)換將各種類型轉(zhuǎn)換為Class。

?

參考鏈接:https://blog.csdn.net/u010987379/article/details/52152795

3、?Annotation類型又與接口有著近似之處。它們可以定義常量、靜態(tài)成員類型(比如枚舉類型定義)。Annotation類型也可以如接口一般被實(shí)現(xiàn)或者繼承。

?

?

*?元注解@Target,@Retention,@Documented,@Inherited?
*?
* @Target?表示該注解用于什么地方,可能的?ElemenetType?參數(shù)包括:?
* ElemenetType.CONSTRUCTOR?構(gòu)造器聲明?
* ElemenetType.FIELD?域聲明(包括?enum?實(shí)例)?
* ElemenetType.LOCAL_VARIABLE?局部變量聲明?
* ElemenetType.METHOD?方法聲明?
* ElemenetType.PACKAGE?包聲明?
* ElemenetType.PARAMETER?參數(shù)聲明?
* ElemenetType.TYPE?類,接口(包括注解類型)或enum聲明?
*?
* @Retention?表示在什么級別保存該注解信息??蛇x的?RetentionPolicy?參數(shù)包括:?
* RetentionPolicy.SOURCE?注解將被編譯器丟棄?
* RetentionPolicy.CLASS?注解在class文件中可用,但會被VM丟棄?
* RetentionPolicy.RUNTIME VM將在運(yùn)行期也保留注釋,因此可以通過反射機(jī)制讀取注解的信息。?
*?
* @Documented?將此注解包含在?javadoc?中?
*?
* @Inherited?允許子類繼承父類中的注解

?


@Target(ElementType.METHOD)?
@Retention(RetentionPolicy.RUNTIME)?
@Documented?
@Inherited

?

?

下面的示例來簡單的講述spring注解原理:

本例實(shí)現(xiàn)了在set方法上和在字段屬性上注解的處理解析。

1、定義注解

Java代碼??
  • package?com.yt.annotation;??
  • ??
  • import?java.lang.annotation.ElementType;??
  • import?java.lang.annotation.Retention;??
  • import?java.lang.annotation.RetentionPolicy;??
  • import?java.lang.annotation.Target;??
  • ??
  • /**?
  • ?*?@Description:定義注解?
  • ?*?@ClassName:?ZxfResource?
  • ?*?@Project:?spring-aop?
  • ?*?@Author:?zxf?
  • ?*?@Date:?2011-6-7?
  • ?*/??
  • //?在運(yùn)行時(shí)執(zhí)行??
  • @Retention(RetentionPolicy.RUNTIME)??
  • //?注解適用地方(字段和方法)??
  • @Target({?ElementType.FIELD,?ElementType.METHOD?})??
  • public?@interface?ZxfResource?{??
  • ??
  • ????//注解的name屬性??
  • ????public?String?name()?default?"";??
  • }??
  • ?2、帶有注解的服務(wù)類

    Java代碼??
  • package?com.yt.annotation;??
  • ??
  • /**?
  • ?*?@Description:?帶有注解的服務(wù)?
  • ?*?@ClassName:?UserDaoImpl?
  • ?*?@Project:?spring-aop?
  • ?*?@Author:?zxf?
  • ?*?@Date:?2011-6-7?
  • ?*/??
  • public?class?UserServiceImpl?{??
  • ??
  • ????public?UserDaoImpl?userDao;??
  • ????public?User1DaoImpl?user1Dao;??
  • ??
  • ????//?字段上的注解,可以配置name屬性??
  • ????@ZxfResource??
  • ????public?User2DaoImpl?user2Dao;??
  • ??
  • ????//?set方法上的注解,帶有name屬性??
  • ????@ZxfResource(name?=?"userDao")??
  • ????public?void?setUserDao(UserDaoImpl?userDao)?{??
  • ????????this.userDao?=?userDao;??
  • ????}??
  • ??
  • ????//?set方法上的注解,沒有配置name屬性??
  • ????@ZxfResource??
  • ????public?void?setUser1Dao(User1DaoImpl?user1Dao)?{??
  • ????????this.user1Dao?=?user1Dao;??
  • ????}??
  • ??
  • ????public?void?show()?{??
  • ????????userDao.show();??
  • ????????user1Dao.show1();??
  • ????????user2Dao.show2();??
  • ????????System.out.println("這里是Service方法........");??
  • ????}??
  • }??
  • ?3、要注入的DAO

    Java代碼??
  • package?com.yt.annotation;??
  • ??
  • /**?
  • ?*?@Description:?要注入的DAo類?
  • ?*?@ClassName:?UserDaoImpl?
  • ?*?@Project:?spring-aop?
  • ?*?@Author:?zxf?
  • ?*?@Date:?2011-6-7?
  • ?*/??
  • public?class?UserDaoImpl?{??
  • ??????
  • ????String?name?;??
  • ??????
  • ????public?void?show(){??
  • ????????System.out.println("這里是dao方法........");??
  • ????}??
  • }??
  • Xml代碼??
  • <?xml?version="1.0"?encoding="UTF-8"?>??
  • <beans>??
  • ????<bean?id?=?"userDao"?class="com.yt.annotation.UserDaoImpl"?/>??
  • ????<bean?id?=?"user1Dao"?class="com.yt.annotation.User1DaoImpl"?/>??
  • ????<bean?id?=?"user2Dao"?class="com.yt.annotation.User2DaoImpl"?/>??
  • ????<bean?id?=?"userService"?class?=?"com.yt.annotation.UserServiceImpl"?/>??
  • </beans>??
  • ?

    ?4、注解處理器

    Java代碼??
  • package?com.yt.annotation;??
  • ??
  • import?java.beans.Introspector;??
  • import?java.beans.PropertyDescriptor;??
  • import?java.lang.reflect.Field;??
  • import?java.lang.reflect.Method;??
  • import?java.util.ArrayList;??
  • import?java.util.HashMap;??
  • import?java.util.Iterator;??
  • import?java.util.List;??
  • import?java.util.Map;??
  • import?org.apache.log4j.Logger;??
  • import?org.dom4j.Document;??
  • import?org.dom4j.DocumentException;??
  • import?org.dom4j.Element;??
  • import?org.dom4j.io.SAXReader;??
  • ??
  • /**?
  • ?*?@Description:?spring中的注解原理?
  • ?*?@ClassName:?ClassPathXMLApplicationContext?
  • ?*?@Project:?spring-aop?
  • ?*?@Author:?zxf?
  • ?*?@Date:?2011-6-3?
  • ?*/??
  • public?class?ClassPathXMLApplicationContext?{??
  • ??
  • ????Logger?log?=?Logger.getLogger(ClassPathXMLApplicationContext.class);??
  • ??
  • ????List<BeanDefine>?beanList?=?new?ArrayList<BeanDefine>();??
  • ????Map<String,?Object>?sigletions?=?new?HashMap<String,?Object>();??
  • ??
  • ????public?ClassPathXMLApplicationContext(String?fileName)?{??
  • ????????//讀取配置文件中管理的bean??
  • ????????this.readXML(fileName);??
  • ????????//實(shí)例化bean??
  • ????????this.instancesBean();??
  • ????????//注解處理器??
  • ????????this.annotationInject();??
  • ????}??
  • ??
  • ????/**?
  • ?????*?讀取Bean配置文件?
  • ?????*?@param?fileName?
  • ?????*?@return?
  • ?????*/??
  • ????@SuppressWarnings("unchecked")??
  • ????public?void?readXML(String?fileName)?{??
  • ????????Document?document?=?null;??
  • ????????SAXReader?saxReader?=?new?SAXReader();??
  • ????????try?{??
  • ????????????ClassLoader?classLoader?=???
  • ????????????????Thread.currentThread().getContextClassLoader();??
  • ????????????document?=?saxReader.read(classLoader.getResourceAsStream(fileName));??
  • ????????????Element?beans?=?document.getRootElement();??
  • ????????????for?(Iterator<Element>?beansList?=?beans.elementIterator();???
  • ????????????????beansList.hasNext();)?{??
  • ????????????????Element?element?=?beansList.next();??
  • ????????????????BeanDefine?bean?=?new?BeanDefine(??
  • ????????????????????????element.attributeValue("id"),??
  • ????????????????????????element.attributeValue("class"));??
  • ????????????????beanList.add(bean);??
  • ????????????}??
  • ????????}?catch?(DocumentException?e)?{??
  • ????????????log.info("讀取配置文件出錯(cuò)....");??
  • ????????}??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?實(shí)例化Bean?
  • ?????*/??
  • ????public?void?instancesBean()?{??
  • ????????for?(BeanDefine?bean?:?beanList)?{??
  • ????????????try?{??
  • ????????????????sigletions.put(bean.getId(),???
  • ????????????????????????Class.forName(bean.getClassName()).newInstance());??
  • ????????????}?catch?(Exception?e)?{??
  • ????????????????log.info("實(shí)例化Bean出錯(cuò)...");??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?注解處理器?
  • ?????*?如果注解ZxfResource配置了name屬性,則根據(jù)name所指定的名稱獲取要注入的實(shí)例引用,?
  • ?????*?如果注解ZxfResource;沒有配置name屬性,則根據(jù)屬性所屬類型來掃描配置文件獲取要?
  • ?????*?注入的實(shí)例引用?
  • ?????*??
  • ?????*/??
  • ????public?void?annotationInject(){??
  • ????????for(String?beanName:sigletions.keySet()){??
  • ????????????Object?bean?=?sigletions.get(beanName);??
  • ????????????if(bean!=null){??
  • ????????????????this.propertyAnnotation(bean);??
  • ????????????????this.fieldAnnotation(bean);??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?處理在set方法加入的注解?
  • ?????*?@param?bean?處理的bean?
  • ?????*/??
  • ????public?void?propertyAnnotation(Object?bean){??
  • ????????try?{??
  • ????????????//獲取其屬性的描述??
  • ????????????PropertyDescriptor[]?ps?=???
  • ????????????????Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();??
  • ????????????for(PropertyDescriptor?proderdesc?:?ps){??
  • ????????????????//獲取所有set方法??
  • ????????????????Method?setter?=?proderdesc.getWriteMethod();??
  • ????????????????//判斷set方法是否定義了注解??
  • ????????????????if(setter!=null?&&?setter.isAnnotationPresent(ZxfResource.class)){??
  • ????????????????????//獲取當(dāng)前注解,并判斷name屬性是否為空??
  • ????????????????????ZxfResource?resource?=?setter.getAnnotation(ZxfResource.class);??
  • ????????????????????String?name?="";??
  • ????????????????????Object?value?=?null;??
  • ????????????????????if(resource.name()!=null&&!"".equals(resource.name())){??
  • ????????????????????????//獲取注解的name屬性的內(nèi)容??
  • ????????????????????????name?=?resource.name();??
  • ????????????????????????value?=?sigletions.get(name);??
  • ????????????????????}else{?//如果當(dāng)前注解沒有指定name屬性,則根據(jù)類型進(jìn)行匹配??
  • ????????????????????????for(String?key?:?sigletions.keySet()){??
  • ????????????????????????????//判斷當(dāng)前屬性所屬的類型是否在配置文件中存在??
  • ????????????????????????????if(proderdesc.getPropertyType().isAssignableFrom(sigletions.get(key).getClass())){??
  • ????????????????????????????????//獲取類型匹配的實(shí)例對象??
  • ????????????????????????????????value?=?sigletions.get(key);??
  • ????????????????????????????????break;??
  • ????????????????????????????}??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????????//允許訪問private方法??
  • ????????????????????setter.setAccessible(true);??
  • ????????????????????//把引用對象注入屬性??
  • ????????????????????setter.invoke(bean,?value);???
  • ????????????????}??
  • ????????????}??
  • ????????}?catch?(Exception?e)?{??
  • ????????????log.info("set方法注解解析異常..........");??
  • ????????}??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?處理在字段上的注解?
  • ?????*?@param?bean?處理的bean?
  • ?????*/??
  • ????public?void?fieldAnnotation(Object?bean){??
  • ????????try?{??
  • ????????????//獲取其全部的字段描述??
  • ????????????Field[]?fields?=?bean.getClass().getFields();??
  • ????????????for(Field?f?:?fields){??
  • ????????????????if(f!=null?&&?f.isAnnotationPresent(ZxfResource.class)){??
  • ????????????????????ZxfResource?resource?=?f.getAnnotation(ZxfResource.class);??
  • ????????????????????String?name?="";??
  • ????????????????????Object?value?=?null;??
  • ????????????????????if(resource.name()!=null&&!"".equals(resource.name())){??
  • ????????????????????????name?=?resource.name();??
  • ????????????????????????value?=?sigletions.get(name);??
  • ????????????????????}else{??
  • ????????????????????????for(String?key?:?sigletions.keySet()){??
  • ????????????????????????????//判斷當(dāng)前屬性所屬的類型是否在配置文件中存在??
  • ????????????????????????????if(f.getType().isAssignableFrom(sigletions.get(key).getClass())){??
  • ????????????????????????????????//獲取類型匹配的實(shí)例對象??
  • ????????????????????????????????value?=?sigletions.get(key);??
  • ????????????????????????????????break;??
  • ????????????????????????????}??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????????//允許訪問private字段??
  • ????????????????????f.setAccessible(true);??
  • ????????????????????//把引用對象注入屬性??
  • ????????????????????f.set(bean,?value);??
  • ????????????????}??
  • ????????????}??
  • ????????}?catch?(Exception?e)?{??
  • ????????????log.info("字段注解解析異常..........");??
  • ????????}??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?獲取Map中的對應(yīng)的bean實(shí)例?
  • ?????*?@param?beanId?
  • ?????*?@return?
  • ?????*/??
  • ????public?Object?getBean(String?beanId)?{??
  • ????????return?sigletions.get(beanId);??
  • ????}??
  • ??
  • ??
  • ????public?static?void?main(String[]?args)?{??
  • ????????ClassPathXMLApplicationContext?path?=?new?ClassPathXMLApplicationContext(??
  • ????????????????"configAnnotation.xml");??
  • ????????UserServiceImpl?userService?=(UserServiceImpl)path.getBean("userService");??
  • ????????userService.show();??
  • ????}??
  • } ?
  • 個(gè)人分類:?spring

    轉(zhuǎn)載于:https://www.cnblogs.com/xiohao/p/9006217.html

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的Java注解的基本概念和原理及其简单实用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。