SpringBoot中的注解分析


java SE 中的注解:

 一、注解分類:

 1.由編譯器使用的注解

 

例如:

@Override:讓編譯器檢查該方法是否正確地實現了覆寫;

@SuppressWarnings:告訴編譯器忽略此處代碼產生的警告。

@Deprecated:該注解標注的內容,表示已過時

這類注解不會被編譯進入.class文件,它們在編譯后就被編譯器扔掉了。

2.由工具處理.class文件使用的注解

比如有些工具會在加載class的時候,對class做動態修改,實現一些特殊的功能。

這類注解會被編譯進入.class文件,但加載結束后並不會存在於內存中。這類注解只被一些底層庫使用,一般我們不必自己處理。

3.在程序運行期能夠讀取的注解,它們在加載后一直存在於JVM中,這也是最常用的注解。

例如,一個配置了@PostConstruct的方法會在調用構造方法后自動被調用(這是Java代碼讀取該注解實現的功能,JVM並不會識別該注解)

二、自定義注解:

格式:

元注解
public @interface 注解名稱{
屬性列表;
}

三、元注解:

有一些注解可以修飾其他注解,這些注解就稱為元注解(meta annotation)

@Target:描述注解能夠作用的位置
ElementType.TYPE:可以作用於類上
ElementType.METHOD:可以作用於方法上
ElementType.FIELD:可以作用於成員變量上
ElementType.CONSTRUCTOR:可以作用在構造方法上
ElementType.PARAMETER:可以作用在方法的參數上
@Retention:定義了Annotation的生命周期
RetentionPolicy.SOURCE:僅編譯期
RetentionPolicy.CLASS:僅class文件
RetentionPolicy.RUNTIME:運行期
SOURCE類型的注解主要由編譯器使用,因此我們一般只使用,不編寫。
CLASS類型的注解主要由底層工具庫使用,涉及到class的加載,一般我們很少用到。
只有RUNTIME類型的注解不但要使用,還經常需要編寫。
@Inherited:定義子類是否可繼承父類定義的Annotation。
@Inherited僅針對@Target(ElementType.TYPE)類型的annotation有效,並且僅針對class的繼承,對interface的繼承無效。
@Documented:描述注解是否被抽取到api文檔中
@Repeatable:描述這個元注解修飾的Annotation是否可重復。

 

SpringBoot中注解的分析:

 

 

這是每一個springboot項目的啟動類,通過這個@SpringBootApplication這個注解就將整個項目啟動起來了,咱們來看看這個注解到底是怎么做到的:

 

 

不難發現跟我們上邊說的聲明一個注解的方式一樣,咱們把元注解刪掉再看

 

 

就只剩下@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan,也可以說@SpringBootApplication就是這個三個注解

1.@SpringBootConfiguration:

 

 

 

看圖這個注解是由@Document和@Configuration組成的。

 

 

 

從圖中不難看出@Document是一個空的注解不用關心,而我們關系的則是@Configuration,而在圖中我們可以看到了我們熟悉的@Component這個注解,在Spring框架中看見過是用來把普通pojo實例化到spring容器中,相當於配置文件中的<bean id="" class=""/>。2.@EnableAutoConfiguration(核心)

 

 

圖中可以看出是由@AutoConfigurationPackage和@Import組成

 

 

從圖中可以看@AutoConfigurationPackage這個注解也被@Import所用到,咱們單獨看這個@Import,字面意思是導入的意思,導入什么那,看傳入的值AutoConfigurationImportSelector.class,這個類是做什么的

 

 

經過代碼的分析我們發現一個spring.factories的文件這里邊是我們啟動代碼時所用的類的全路徑都放到了這個文件中。
3.@ComponentScan作用:掃描並注冊帶@Component以及擴展的標注(如@Controller、@Service、@Respository等)的類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM