1. 程式人生 > >spring元註解說明和註解簡單解析以及部分常見註解說明

spring元註解說明和註解簡單解析以及部分常見註解說明

背景:熟悉註解的作用,以及有可能需要自定義註解。

元註解:
@Target
表示該註解可以用於什麼地方,可能的ElementType引數有:
CONSTRUCTOR:構造器的宣告
FIELD:域宣告(包括enum例項)
LOCAL_VARIABLE:區域性變數宣告
METHOD:方法宣告
PACKAGE:包宣告
PARAMETER:引數宣告
TYPE:類、介面(包括註解型別)或enum宣告

@Retention
表示需要在什麼級別儲存該註解資訊。可選的RetentionPolicy引數包括:
SOURCE:註解將被編譯器丟棄
CLASS:註解在class檔案中可用,但會被VM丟棄
RUNTIME:VM將在執行期間保留註解,因此可以通過反射機制讀取註解的資訊

@Document
將註解包含在Javadoc中

@Inherited
允許子類繼承父類中的註解

示例:spring4.3.2
@Autowired原始碼

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.beans.factory.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true; 
}

注:required()方法是註解Autowired的屬性,預設為true時,Spring 容器中匹配的候選 Bean 數目必須有且僅有一個。當找不到一個匹配的 Bean 時,Spring 容器將丟擲BeanCreationException 異常,並指出必須至少擁有一個匹配的 Bean。使用false的情況看具體業務而使用,這種情況在找不到匹配 Bean 時也不報錯。如果 Spring 容器中擁有多個候選 Bean,Spring 容器在啟動時也會丟擲 BeanCreationException 異常。這時需要@Qualifier指定bean的名稱。

@Qualifier原始碼

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package javax.inject;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Qualifier {
}