生活随笔
收集整理的這篇文章主要介紹了
Java注解的基本概念和原理及其简单实用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 一、注解的基本概念和原理及其簡單實用
注解(Annotation)提供了一種安全的類似注釋的機制,為我們在代碼中添加信息提供了一種形式化得方法,使我們可以在稍后某個時刻方便的使用這些數據(通過解析注解來使用這些數據),用來將任何的信息或者元數據與程序元素(類、方法、成員變量等)進行關聯。其實就是更加直觀更加明了的說明,這些說明信息與程序業務邏輯沒有關系,并且是供指定的工具或框架使用的。Annotation像一種修飾符一樣,應用于包、類型、構造方法、方法、成員變量、參數及本地變量的申明語句中。
Annotation其實是一種接口。通過Java的反射機制相關的API來訪問Annotation信息。相關類(框架或工具中的類)根據這些信息來決定如何使用該程序元素或改變它們的行為。Java語言解釋器在工作時會忽略這些Annotation,因此在JVM中這些Annotation是“不起作用”的,只能通過配套的工具才能對這些Annotation類型的信息進行訪問和處理。
?
Annotation和interface的異同:
1、?annotition的類型使用關鍵字@interface而不是interface。它繼承了java.lang.annotition.Annotition接口,并非申明了一個interface。
2、?Annotation類型、方法定義是獨特的、受限制的。Annotation類型的方法必須申明為無參數、無異常拋出的。這些方法定義了Annotation的成員:方法名稱為了成員名,而方法返回值稱為了成員的類型。而方法返回值必須為primitive類型、Class類型、枚舉類型、Annotation類型或者由前面類型之一作為元素的一位數組。方法的后面可以使用default和一個默認數值來申明成員的默認值,null不能作為成員的默認值,這與我們在非Annotation類型中定義方法有很大不同。Annotation類型和他的方法不能使用Annotation類型的參數,成員不能是generic。只有返回值類型是Class的方法可以在Annotation類型中使用generic,因為此方法能夠用類轉換將各種類型轉換為Class。
?
參考鏈接:https://blog.csdn.net/u010987379/article/details/52152795
3、?Annotation類型又與接口有著近似之處。它們可以定義常量、靜態成員類型(比如枚舉類型定義)。Annotation類型也可以如接口一般被實現或者繼承。
?
?
*?元注解@Target,@Retention,@Documented,@Inherited?
*?
* @Target?表示該注解用于什么地方,可能的?ElemenetType?參數包括:?
* ElemenetType.CONSTRUCTOR?構造器聲明?
* ElemenetType.FIELD?域聲明(包括?enum?實例)?
* ElemenetType.LOCAL_VARIABLE?局部變量聲明?
* ElemenetType.METHOD?方法聲明?
* ElemenetType.PACKAGE?包聲明?
* ElemenetType.PARAMETER?參數聲明?
* ElemenetType.TYPE?類,接口(包括注解類型)或enum聲明?
*?
* @Retention?表示在什么級別保存該注解信息。可選的?RetentionPolicy?參數包括:?
* RetentionPolicy.SOURCE?注解將被編譯器丟棄?
* RetentionPolicy.CLASS?注解在class文件中可用,但會被VM丟棄?
* RetentionPolicy.RUNTIME VM將在運行期也保留注釋,因此可以通過反射機制讀取注解的信息。?
*?
* @Documented?將此注解包含在?javadoc?中?
*?
* @Inherited?允許子類繼承父類中的注解
?
@Target(ElementType.METHOD)?
@Retention(RetentionPolicy.RUNTIME)?
@Documented?
@Inherited
?
?
下面的示例來簡單的講述spring注解原理:
本例實現了在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;????@Retention(RetentionPolicy.RUNTIME)??@Target({?ElementType.FIELD,?ElementType.METHOD?})??public?@interface?ZxfResource?{????????????public?String?name()?default?"";??}?? ?2、帶有注解的服務類
Java代碼??
package?com.yt.annotation;????public?class?UserServiceImpl?{????????public?UserDaoImpl?userDao;??????public?User1DaoImpl?user1Dao;????????????@ZxfResource??????public?User2DaoImpl?user2Dao;????????????@ZxfResource(name?=?"userDao")??????public?void?setUserDao(UserDaoImpl?userDao)?{??????????this.userDao?=?userDao;??????}????????????@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;????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;????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)?{??????????????????this.readXML(fileName);??????????????????this.instancesBean();??????????????????this.annotationInject();??????}????????????@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("讀取配置文件出錯....");??????????}??????}????????????????public?void?instancesBean()?{??????????for?(BeanDefine?bean?:?beanList)?{??????????????try?{??????????????????sigletions.put(bean.getId(),???????????????????????????Class.forName(bean.getClassName()).newInstance());??????????????}?catch?(Exception?e)?{??????????????????log.info("實例化Bean出錯...");??????????????}??????????}??????}????????????????public?void?annotationInject(){??????????for(String?beanName:sigletions.keySet()){??????????????Object?bean?=?sigletions.get(beanName);??????????????if(bean!=null){??????????????????this.propertyAnnotation(bean);??????????????????this.fieldAnnotation(bean);??????????????}??????????}??????}????????????????public?void?propertyAnnotation(Object?bean){??????????try?{??????????????????????????PropertyDescriptor[]?ps?=???????????????????Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();??????????????for(PropertyDescriptor?proderdesc?:?ps){??????????????????????????????????Method?setter?=?proderdesc.getWriteMethod();??????????????????????????????????if(setter!=null?&&?setter.isAnnotationPresent(ZxfResource.class)){??????????????????????????????????????????ZxfResource?resource?=?setter.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()){??????????????????????????????????????????????????????????if(proderdesc.getPropertyType().isAssignableFrom(sigletions.get(key).getClass())){??????????????????????????????????????????????????????????????????value?=?sigletions.get(key);??????????????????????????????????break;??????????????????????????????}??????????????????????????}??????????????????????}??????????????????????????????????????????setter.setAccessible(true);??????????????????????????????????????????setter.invoke(bean,?value);???????????????????}??????????????}??????????}?catch?(Exception?e)?{??????????????log.info("set方法注解解析異常..........");??????????}??????}????????????????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()){??????????????????????????????????????????????????????????if(f.getType().isAssignableFrom(sigletions.get(key).getClass())){??????????????????????????????????????????????????????????????????value?=?sigletions.get(key);??????????????????????????????????break;??????????????????????????????}??????????????????????????}??????????????????????}??????????????????????????????????????????f.setAccessible(true);??????????????????????????????????????????f.set(bean,?value);??????????????????}??????????????}??????????}?catch?(Exception?e)?{??????????????log.info("字段注解解析異常..........");??????????}??????}????????????????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();??????}??} ? 個人分類:?spring
轉載于:https://www.cnblogs.com/xiohao/p/9006217.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Java注解的基本概念和原理及其简单实用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。