1. 程式人生 > >框架註解(轉載加個人補充)

框架註解(轉載加個人補充)

註解的好處:

1.能夠讀懂別人寫的程式碼,特別是框架相關的程式碼。

2.本來可能需要很多配置檔案,需要很多邏輯才能實現的內容,就可以使用一個或者多個註解來替代,這樣就使得程式設計更加簡潔,程式碼更加清晰。

3.(重點)刮目相看。
(但是怎麼樣才能讓別人刮目相看呢?會用註解不是目的,最重要的是要使用自定義註解來解決問題。)
舉個栗子:
如果面試的時候,你跟老闆說你會使用註解,老闆覺得你這個人還行;但是如果老闆發現你會自定義註解解決問題,老闆肯定就會眼前一亮。

註解這一概念是在java1.5版本提出的,說Java提供了一種原程式中的元素關聯任何資訊和任何元資料的途徑的方法。

一、Java中的常見註解

1)JDK註解


JDK註解一共分為三類:

JDK註解.png

案例:
我們先新建一個介面people,如下:

public interface people {
    public String name();
    public int age();
    public void work();
}

然後再建一個類Child實現類people這個介面,並實現該類的方法:

public class Child implements people {
    @Override
    public String name() {
        return null;
    }

    @Override
    public
int age()
{ return 0; } @Override public void work() { }

看到這裡,我們發現這裡的所有方法都會加上一個@Override標記,它告訴我們,同時也告訴編譯器我們的這些方法肯定覆蓋了類people裡面的方法的。假如說,我現在把類people裡面的某一個方法註釋掉:

//public String name();

再看類Child裡面的name方法就會報錯。這樣,以後大家看到@Override的時候就能想到這個方法是覆蓋了某個介面的方法的。

然後,我們回過頭來看類people裡面有一個work的方法。這裡我們可以理解為人是要工作的,但是並不是所有的人都在工作,那麼怎麼辦呢?如果說這個介面正在用,我們不能刪除這個方法,這個時候我們就可以這樣:

@Deprecated
public void work();

@Deprecated標記就表明這個方法已經過時了,在實際中,它又有什麼樣的應用場景呢?我們在建一個測試類:

public class Test {
    public void work() {
        people people=new Child();
!       people.work();
    }
}

這個時候我們會發現myeclipse會給一個警告,並且在work中間出現一個破折號,意思就是這個方法已經過時了。那麼問題來了,雖然這個方法過時了,但是我們就是那麼傲嬌,一定要用它,怎麼辦呢?只需要這樣:

public class Test {
    @SuppressWarnings("deprecation")
    public void work() {
        people people=new Child();
        people.work();
    }
}

這樣我們就忽略了這個警告。@SuppressWarnings("deprecation")就表示我們忽略了deprecation這樣的一個警告。

2)Java第三方註解

補充

1.在 service層有@Service 、在Controller有@Controller、在Dao層有@Repository

PS:@controller 控制器(注入服務)、@service 服務(注入dao)、@repository dao(實現dao訪問)

[email protected]與@Resource的區別

a、@Autowired與@Resource都可以用來裝配bean. 都可以寫在欄位上,或寫在setter方法上。 
b、@Autowired預設按型別裝配(這個註解是屬業spring的),預設情況下必須要求依賴物件必須存在,如果要允許null 值,可以設定它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier註解進行使用,如下: 

  1. @Autowired() @Qualifier("baseDao")     
  2. private BaseDao baseDao;  

c、@Resource(這個註解屬於J2EE的),預設安照名稱進行裝配,名稱可以通過name屬性進行指定, 
如果沒有指定name屬性,當註解寫在欄位上時,預設取欄位名進行按照名稱查詢,如果註解寫在setter方法上預設取屬性名進行裝配。 當找不到與名稱匹配的bean時才按照型別進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。
  1. @Resource(name="baseDao")     
  2. private BaseDao baseDao;

d、java程式碼中可以使用@Autowire或者@Resource註解方式進行裝配,這兩個註解的區別是:
@Autowire 預設按照型別裝配,預設情況下它要求依賴物件必須存在如果允許為null,可以設定它required屬性為false,如果我們想使用按照名稱裝配,可 以結合@Qualifier註解一起使用;

@Resource預設按照名稱裝配,當找不到與名稱匹配的bean才會按照型別裝配,可以通過name屬性指定,如果沒有指定name屬 性,當註解標註在欄位上,即預設取欄位的名稱作為bean名稱尋找依賴物件,當註解標註在屬性的setter方法上,即預設取屬性名作為bean名稱尋找 依賴物件.

3. @PreDestroy(JSR-250)註解 在方法上加上註解@PreDestroy,

這個方法就會在Bean初始化之後被Spring容器執行。其用法同@PostConstruct。和@PostConstruct 區別在於:@PostConstruct註釋的方法將在類例項化後呼叫,而標註了 @PreDestroy 的方法將在類銷燬之前呼叫。

[email protected]註解 

在使用XML定義Bean時,我們可能還需要通過bean的scope屬性來定義一個Bean的作用範圍,我們同樣可以通過@Scope註解來完成這項工作:

@Scope("prototype")
@Controller

預設是單例模式,即scope="singleton"。另外scope還有prototype、request、session、global session作用域。scope="prototype"多例

@scope預設是單例模式(singleton)

如果需要設定的話@scope("prototype")

1.singleton單例模式,

  全域性有且僅有一個例項

2.prototype原型模式,

  每次獲取Bean的時候會有一個新的例項

3.request

  request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效,配置例項:request、session、global session使用的時候首先要在初始化web的web.xml中做如下配置:如果你使用的是Servlet 2.4及以上的web容器,那麼你僅需要在web應用的XML宣告檔案web.xml中增加下述ContextListener即可: 
1234567<web-app>...<listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class></listener>...</web-app>

4.session

  session作用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效

5.global session

global session作用域類似於標準的HTTP Session作用域,不過它僅僅在基於portlet的web應用中才有意義。Portlet規範定義了全域性Session的概念,它被所有構成某個 portlet web應用的各種不同的portlet所共享。在global session作用域中定義的bean被限定於全域性portlet Session的生命週期範圍內。如果你在web中使用global session作用域來標識bean,那麼web會自動當成session型別來使用。

二、註解的分類

1)按照執行機制劃分:
【原始碼註解→編譯時註解→執行時註解】

原始碼註解:只在原始碼中存在,編譯成.class檔案就不存在了。

編譯時註解:在原始碼和.class檔案中都存在。像前面的@Override、@Deprecated、@SuppressWarnings,他們都屬於編譯時註解。

執行時註解:在執行階段還起作用,甚至會影響執行邏輯的註解。像@Autowired自動注入的這樣一種註解就屬於執行時註解,它會在程式執行的時候把你的成員變數自動的注入進來。

2)按照來源劃分:
【來自JDK的註解——來自第三方的註解——自定義註解】

3)元註解:
元註解是給註解進行註解,可以理解為註解的註解就是元註解。

三、自定義註解

我們分四步來解析自定義註解:
自定義註解的語法要求:

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
    String desc();
    String author();
    int age() default 18;
}

首先我們要明確這不是一個介面,它是使用@interface關鍵字定義的一個註解。
然後我們看下面的幾個方法,String desc();雖然它很類似於接口裡面的方法,其實它在註解裡面只是一個成員變數(成員以無參無異常的方式宣告),int age() default 18;(成員變數可以用default指定一個預設值的)。
最後我們要知道:
①.成員型別是受限制的,合法的型別包括基本的資料型別以及String,Class,Annotation,Enumeration等。
②.如果註解只有一個成員,則成員名必須取名為value(),在使用時可以忽略成員名和賦值號(=)。
③.註解類可以沒有成員,沒有成員的註解稱為標識註解。

元註解:

有沒有發現上面那段程式碼有一個沒有說呢?沒錯,它們就是我們所說的元註解:

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented

我們先看第一行:@Target是這個註解的作用域,ElementType.METHOD是這個註解的作用域的列表,METHOD是方法宣告,除此之外,還有:
CONSTRUCTOR(構造方法宣告),FIELD(欄位宣告),LOCAL VARIABLE(區域性變數宣告),METHOD(方法宣告),PACKAGE(包宣告),PARAMETER(引數宣告),TYPE(類介面)

第二行:@Retention是它的生命週期,前面不是說註解按照執行機制有一個分類嘛,RUNTIME就是在執行時存在,可以通過反射讀取。除此之外,還有:
SOURCE(只在原始碼顯示,編譯時丟棄),CLASS(編譯時記錄到class中,執行時忽略),RUNTIME(執行時存在,可以通過反射讀取)

第三行:@Inherited是一個標識性的元註解,它允許子註解繼承它。

第四行:@Documented,生成javadoc時會包含註解。

使用自定義註解:
使用註解的語法:
@<註解名>(<成員名1>=<成員值1>,<成員名1>=<成員值1>,...)
案例:

    @Description(desc="i am Color",author="boy",age=18)
    public String Color() {
        return "red";
    }

這裡的Description是我們剛才在自定義註解語法要求裡面定義的註解噢,然後我們可以給它的每一個成員變數賦值,注意資料型別。值得注意的是,因為我們前面定義的作用域是在方法和類介面上,所以這個註解在Color()方法上使用是沒問題的。

解析註解
概念:

通過反射獲取類 、函式或成員上的執行時註解資訊,從而實現動態控制程式執行的邏輯。

準備工作:

Description類.pngChild類.png

接下來,我們就開始測試了:

public class ParseAnn {
    public static void main(String[] args) {
        try {
            // 使用類載入器載入類
            Class c = Class.forName("com.test.Child");
            // 找到類上面的註解
            boolean isExist = c.isAnnotationPresent(Description.class);
            // 上面的這個方法是用這個類來判斷這個類是否存在Description這樣的一個註解
            if (isExist) {
                // 拿到註解例項,解析類上面的註解
                Description d = (Description) c.getAnnotation(Description.class);
                System.out.println(d.value());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

輸出的結果:
i am class annotation
可以看到,我們成功的解析了Child類上面的註解。

接下來,我們繼續解析方法上的註解:

            //獲取所有的方法
            Method[] ms = c.getMethods();
            // 遍歷所有的方法
            for (Method m : ms) {
                boolean isExist1 = m.isAnnotationPresent(Description.class);
                if (isExist1) {
                    Description d1=m.getAnnotation(Description.class);
                    System.out.println(d1.value());
                }
            }

輸出的結果:
i am class annotation
i am method annotation
可以看到,我們成功的解析了方法上面的註解。

            //另一種解析方法
            for (Method m : ms) {
                //拿到方法上的所有的註解
                Annotation[] as=m.getAnnotations();
                for (Annotation a : as) {
                    //用二元操作符判斷a是否是Description的例項
                    if (a instanceof Description) {
                        Description d=(Description) a;
                        System.out.println(d.value());
                    }
                }
            }

也可以得到上面的效果。

此時,如果把Description類裡面的元註解改一下,比如:
@Retention(RetentionPolicy.RUNTIME)→@Retention(RetentionPolicy.SOURCE),再執行程式,結果會成怎樣呢?如果改成CLASS呢?讀者們要不要試一試?

相關推薦

框架註解轉載個人補充

註解的好處:1.能夠讀懂別人寫的程式碼,特別是框架相關的程式碼。2.本來可能需要很多配置檔案,需要很多邏輯才能實現的內容,就可以使用一個或者多個註解來替代,這樣就使得程式設計更加簡潔,程式碼更加清晰。3.(重點)刮目相看。(但是怎麼樣才能讓別人刮目相看呢?會用註解不是目的,最重要的是要使用自定義註解來解決問題

如何利用arcgis製作好看的地形圖轉載個人註解

如何製作好看的地形圖? 現在有一個方法讓地形圖看起來比較好,那就是3D地圖—立體地形圖 如何進行製作呢? 網上有不少相關方法,如果有一定基礎,肯定一看就懂,但是像我這樣的小白使用者,卻不一定能懂,因此,把自己在操作過程中遇到的一些問題,以及如何進行解決

MySQL查看和修改表的存儲引擎轉載+點東西

ont color 存儲引擎 null stop net engines char ini 1 查看系統支持的存儲引擎 show engines; 2 查看表使用的存儲引擎 兩種方法: a、show table status from YOUR_DB_NAME

Spring註解轉載&補充

Spring部分 1.宣告bean的註解 @Component 元件,沒有明確的角色 @Service 在業務邏輯層使用(service層) @Repository 在資料訪問層使用(dao層) @Controller 在展現層使用,控制器的宣告(C) 2.注入bean的註解

spring常用註解轉載http://elf8848.iteye.com/blog/442806

odin Coding spa -c tle 類型 epo sta frame 1 引入context命名空間(在Spring的配置文件中),配置文件如下: Xml代碼 xmlns:context="http://www.springframework.org/

Activiti 框架中的事件的定義描述轉載,備忘

---------------------------------------------------------------------------------------------------------------------------------------------

ORM框架---FluentData轉載

正文: 開始學習 環境要求 .NET 4.0. 支援資料庫 安裝 使用NuGet 搜尋FluentData並安裝。 不使用NuGet 下載zip檔案。 解壓檔案,並將檔案複製到您的解決方案或專案資料夾中。 專案中新增對fluentdata.dll引

udev 自動掛載u盤轉載修改,經過測試

  這裡我們簡單的說一下udev的工作原理:   Udev是依靠於sysfs的,當系統中新增一個新的裝置後,核心檢測到後就會產生一個hotplug event並查詢/proc/sys/kernel/hotplug往找出治理裝置連線的使用者空間程式,若udev已經啟動,核心會通知udev往檢測sysfs中關於

jquery製作具有新增與刪除功能的表單轉載修改

jQuery製作具有新增與刪除功能的表單 效果圖如下: js程式碼如下: $(document).ready(function(){ //<tr/>居中 $("#tab tr").attr("align","center"); //增加&

sql資料庫連線:使用者‘sa’登入失敗問題破解百度個人總結

程式設計環境:Microsoft Visual C# 2005 資料庫:sql server2005 目的:使用GridView控制元件繫結資料 頁面載入時間Page_Load中編寫程式碼如下:         string sqlCon = "Data Source=(l

初探Java企業級開源框架OSGi轉載

第一次接觸OSGi 是2006年看見的一則網上新聞,該新聞中提到BMW 汽車的通訊-娛樂(infotainment)系統採用了OSGi 架構,這套系統主要用來控制汽車上的音箱、燈光、導航和通訊等裝置,整個系統由1000多個模組組成,啟動時間卻只需要3.5秒鐘,這對於一個基於J

beanstalkd協議解讀中文翻譯個人理解

最近有需求做全平臺的定時器,業務複雜,效能要求高,linux crontab的方式不適用,調研一些支援定時執行的記憶體佇列系統,其中beanstalkd較適合。先將其協議研究一遍,使用就不是問題了。 總括 beanstalkd協議基於ASCII編碼執行在tcp上。客戶

C++:程序間通訊部分轉載個人整理

/** * 主題:多執行緒和多程序技術 * */ Q1: C++程序間通訊的方式 管道(命名管道,匿名管道),socket,事件event,共享記憶體,訊息佇列 例項:命名管道例項 /** * 方案如下所示 * 管道服務端:CreateNa

SQL Server 鎖實驗SELECT鎖探究

style 一個 相關 select 當我 gin hold ria san 本例中使用begin tran和with (holdlock)提示來觀察SQL Server在select語句中的鎖。 開啟事務是為了保證時間極短的查詢也能觀察到鎖情況,因為holdlock會在事

android mvp高速開發框架介紹dileber的簡單介紹

activity 數據 -c pos androi mod family 基於 ebe 今天我為大家介紹一款android mvp框架:dileber(https://github.com/dileber/dileber.git) 官方交流qq群:171443

excel打開csv 出現亂碼怎麽解決轉載百度經驗

初學者 環境 文件 先來 pad 編碼 -i width 打開 http://jingyan.baidu.com/article/ac6a9a5e4c681b2b653eacf1.html CSV是逗號分隔值的英文縮寫,通常都是純文本文件。CSV格式是分隔的數據格式,有

Spring框架——AOP面向切面編程詳解

通過 cts ssi 沒有 object 引入 集中 method 可能 1 AOP概述 ●AOP(Aspect-Oriented Programming,面向切面編程):是一種新的方法論,是對傳統 OOP(Object-Oriented Programming,面向對象

java:Mybatis框架1基本配置,log4j

屬性 apache led sta sql inpu ack ima 文件中 1.mybatis01:   db.properties: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3

線程同步之讀寫鎖鎖操作的補充

允許 資源 加鎖 函數 申請 tex bject def 讀取 輕量級的讀寫鎖(Slim Reader-Writer locks):讀寫鎖實際是一種特殊的自旋鎖,它把對共享資源的訪問者劃分成讀者和寫者,讀者只對共享資源進行讀訪問,寫者則需要對共享資源進行寫操作。這種鎖相對於

Too Rich貪心搜索

而且 love sim ret max n-2 decide frame fyi 個人心得:10月份月賽題目,很low,就過了一道水題而且是把所有猜測都提交才過的。這段時間不知道忙什麽去了, 也沒怎麽刷題感覺自己越來越差,還不如新來的大一學弟呢,別人起碼天天刷代碼到半夜,比