最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

5分鐘搞懂java注解@Annotation的具體使用

 更新時間:2019年05月15日 09:34:38   作者:打怪升級路  
這篇文章主要介紹了5分鐘搞懂java注解@Annotation的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

首先一句話結(jié)論:注解就是一種通過在類、方法、或者屬性等上使用類似@xxx的方式進行“打標簽”,然后可以通過反射機制對標簽的內(nèi)容進行解析并進行相應(yīng)處理的手段。

注解是java中的一個重要知識點,從java5后開始引入,尤其在spring框架中大量使用。比較常用的有@controller、@service等等各種,本文將從注解的實現(xiàn)原理出發(fā),通過一些demo代碼的實現(xiàn),進行分析。

一、 注解定義方式

直接上代碼,看看spring中@Service注解的定義就知道了:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {

 String value() default "";
 
}

可以看到注解的定義和接口定義很像,但是多了@字符,注解的定義上有以下約定:

  • 只能定義屬性名,不能定義方法
  • 屬性的可見性只有public和default,不寫則默認后者
  • 屬性的類型只能支持:基本數(shù)據(jù)類型、string、class、enum、Annotation類型及以上類型的數(shù)組
  • 可以加上defult關(guān)鍵字指明默認值,當某字段不指明默認值時,必須在進行注解標注的時候進行此字段值的指定。
  • 當使用value作為屬性名稱時,可以不顯式指定value=“xxx”,如可以直接使用@Service("xxxService")

二、元注解

所謂元注解就是java中默認實現(xiàn)的專門對注解進行注解的注解。元注解的總數(shù)就5個,下面我們以上面講到的@Service注解為例子各個擊破:

1.@Target

此注解用于表示當前注解的使用范圍,@Target({ElementType.TYPE})就代表著@Service這個注解是專門用來注解到類、接口、或者枚舉類型上面的,當在方法上面加這個注解時,就會報錯??梢钥吹阶⒔馕恢檬且粋€枚舉類型,完整定義如下

public enum ElementType {
  /** Class, interface (including annotation type), or enum declaration */
  TYPE,

  /** Field declaration (includes enum constants) */
  FIELD,

  /** Method declaration */
  METHOD,

  /** Formal parameter declaration */
  PARAMETER,

  /** Constructor declaration */
  CONSTRUCTOR,

  /** Local variable declaration */
  LOCAL_VARIABLE,

  /** Annotation type declaration */
  ANNOTATION_TYPE,

  /** Package declaration */
  PACKAGE,

  /**
   * Type parameter declaration
   *
   * @since 1.8
   */
  TYPE_PARAMETER,

  /**
   * Use of a type
   *
   * @since 1.8
   */
  TYPE_USE
}

2.@Retention

此注解用于表示當前注解的生命周期,說人話就是這個注解作用會保留到什么時候,如@Retention(RetentionPolicy.RUNTIME)就表示在程序運行期間依然有效,此時就可以通過反射拿到注解的信息,完整的枚舉定義如下

public enum RetentionPolicy {
  /**
   * Annotations are to be discarded by the compiler.
   */
  SOURCE,

  /**
   * Annotations are to be recorded in the class file by the compiler
   * but need not be retained by the VM at run time. This is the default
   * behavior.
   */
  CLASS,

  /**
   * Annotations are to be recorded in the class file by the compiler and
   * retained by the VM at run time, so they may be read reflectively.
   *
   * @see java.lang.reflect.AnnotatedElement
   */
  RUNTIME
}

3.@Documented

當被此注解所注解時,使用javadoc工具生成文檔就會帶有注解信息。

4.@Inherited

此注解與繼承有關(guān),當A注解添加此注解后,將A注解添加到某類上,此類的子類就會繼承A注解。

@Inherited
public @interface A{
}

@A
public class Parent{}

public class Son entends Parant{}//Son類繼承了父類的A注解

5.@Repeatable

此注解顧名思義是擁有可以重復(fù)注解的能力。想象這樣一個場景,我們需要定時執(zhí)行某個任務(wù),需要在每周一和周三執(zhí)行,并且這個時間是可以靈活調(diào)整的,此時這個元注解就能派上用場:

@Repeatable(Schedules.class)
public @interface Schedule {
  String date();
}

public @interface Schedules {
  Schedule[] value();
}

@Schedule(date = "周一")
@Schedule(date = "周三")
public class Executor {
}

注意看到此元注解后面括號里內(nèi)容,在這指定的類叫做容器注解,意思是保存這多個注解的容器,故我們創(chuàng)建一個@Schedules注解作為@Schedule的容器注解,容器注解必須含有一個名字為value,返回類型為需放入此容器的注解數(shù)組的屬性。

三、自定義實現(xiàn)一個注解

下面我們以web項目中非常常見的鑒權(quán)場景為例自己實現(xiàn)一個自定義注解。

首先我們定義系統(tǒng)的使用人員身份,有超級管理員、管理員、訪客三種身份。

public enum IdentityEnums {

  SUPER_ADMIN,
  ADMIN,
  VISIVOR

}

接下來我們定義一個權(quán)限注解:

@Target({ElementType.TYPE,ElementType.METHOD})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Authorization {

  IdentityEnums[] value();
  
}


然后使用攔截器的方式,對所有頁面進行統(tǒng)一的鑒權(quán)管理,此處只展示一些關(guān)鍵代碼:

public class AuthInterceptor implements HandlerInterceptor {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    if (handler instanceof HandlerMethod)
    {
      IdentityEnums user = getIdentityFromRequset(request);//這里從request里獲取賬號信息并判斷身份,自己實現(xiàn)
      Authorization auth =((HandlerMethod) handler).getMethodAnnotation(Authorization.class);//獲取方法上面的注解
      if (!Arrays.asList(auth.value()).contains(user)){
        return false;
      }
    }
    return true;
  }
}

最后在spring配置文件中對攔截器進行配置開啟攔截器:

<!-- 攔截器 -->
 <mvc:interceptors>
 <mvc:interceptor>
  <!-- 匹配的是url路徑, 如果不配置或/**,將攔截所有的Controller -->
  <mvc:mapping path="/**" />
  <!-- 攔截器類 -->
  <bean
  class="com.xx.xx.AuthInterceptor"></bean>
 </mvc:interceptor>
 </mvc:interceptors>

在實際使用中,我們將在方法上面添加此自定義注解,當身份權(quán)限符合時,才能對頁面進行訪問,使用方式如下:
@ResponseBody

@RequestMapping(value = "/management")
@Authorization({IdentityEnums.ADMIN,IdentityEnums.SUPER_ADMIN})
public String management(HttpServletRequest request, HttpServletResponse response)
{
  log.info("has permission!");
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springmvc?html資源請求404的問題解決并分析

    springmvc?html資源請求404的問題解決并分析

    這篇文章主要介紹了springmvc?html資源請求404的問題解決并分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java基礎(chǔ)知識精通二維數(shù)組的應(yīng)用

    Java基礎(chǔ)知識精通二維數(shù)組的應(yīng)用

    為了方便組織各種信息,計算機常將信息以表的形式進行組織,然后再以行和列的形式呈現(xiàn)出來。二維數(shù)組的結(jié)構(gòu)決定了其能非常方便地表示計算機中的表,以第一個下標表示元素所在的行,第二個下標表示元素所在的列。下面簡單了解一下二維數(shù)組,包括數(shù)組的聲明和初始化
    2022-04-04
  • springboot對接minio的webhook完整步驟記錄

    springboot對接minio的webhook完整步驟記錄

    Minio是一款開源的對象存儲服務(wù),它致力于為開發(fā)者提供簡單、高性能、高可用的云存儲解決方案,下面這篇文章主要給大家介紹了關(guān)于springboot對接minio的webhook的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • 解決slf4j 和 logback-classic遇到的坑

    解決slf4j 和 logback-classic遇到的坑

    這篇文章主要介紹了解決slf4j 和 logback-classic遇到的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 淺談BeanPostProcessor加載次序及其對Bean造成的影響分析

    淺談BeanPostProcessor加載次序及其對Bean造成的影響分析

    這篇文章主要介紹了淺談BeanPostProcessor加載次序及其對Bean造成的影響分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • SpringBoot2 整合 ClickHouse數(shù)據(jù)庫案例解析

    SpringBoot2 整合 ClickHouse數(shù)據(jù)庫案例解析

    這篇文章主要介紹了SpringBoot2 整合 ClickHouse數(shù)據(jù)庫案例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 淺談Java中的private方法是否可以被代理

    淺談Java中的private方法是否可以被代理

    這篇文章主要介紹了淺談Java中的private方法是否可以被代理,在?Java?8之前,接口可以有常量變量和抽象方法,我們不能在接口中提供方法實現(xiàn),如果我們要提供抽象方法和非抽象方法(方法與實現(xiàn))的組合,那么我們就得使用抽象類,需要的朋友可以參考下
    2023-12-12
  • 在Java和PostgreSQL枚舉之間轉(zhuǎn)換的通用方法

    在Java和PostgreSQL枚舉之間轉(zhuǎn)換的通用方法

    枚舉類型(enum)是一種方便的數(shù)據(jù)類型,允許我們指定一個常量列表,對象字段或數(shù)據(jù)庫列可以設(shè)置為該列表中的值,在本文中,我將回顧處理Java和PostgreSQL枚舉轉(zhuǎn)換的通用方法,需要的朋友可以參考下
    2023-10-10
  • java編程ThreadLocal上下傳遞源碼解析

    java編程ThreadLocal上下傳遞源碼解析

    這篇文章主要為大家介紹了java編程中ThreadLocal提供的上下傳遞方式的源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • Spring通過ApplicationContext主動獲取bean的方法講解

    Spring通過ApplicationContext主動獲取bean的方法講解

    今天小編就為大家分享一篇關(guān)于Spring通過ApplicationContext主動獲取bean的方法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論

宁城县| 会泽县| 芒康县| 盐边县| 广宗县| 洪洞县| 上虞市| 黑龙江省| 成武县| 东阿县| 洛宁县| 宁德市| 莒南县| 黑龙江省| 洪湖市| 河间市| 荔波县| 札达县| 柏乡县| 浠水县| 台北县| 浏阳市| 平罗县| 南乐县| 尉犁县| 鄂伦春自治旗| 宁南县| 北川| 湘潭市| 毕节市| 东城区| 延寿县| 安庆市| 呈贡县| 泸西县| 巢湖市| 河源市| 景东| 五原县| 桦甸市| 新昌县|