Spring boot註解分析

Spring Boot從一開始就告訴咱們,她更喜歡基於Java的配置,即註解的方式。因此她提供了一大堆註解,並讓咱們習慣使用註解。其最大的特色是無需 XML 配置文件,能自動掃描包路徑裝載並注入對象,並能作到根據 classpath 下的 jar 包自動配置。這個過程摒棄了spring以往項目中大量繁瑣的配置,經過自身默認配置,極大的下降了項目搭建的複雜度。一樣在spring boot中,大量註解的使用,使得代碼看起來更加簡潔,提升開發的效率。這些註解不光包括spring boot自有,也有一些是繼承自spring的。java

註解的做用

若是說註釋是寫給人看的,那麼註解就是寫給程序看的。它更像一個標籤,貼在一個類、一個方法或者字段上。它的目的是爲當前讀取該註解的程序提供判斷依據。好比程序只要讀到加了@Test的方法,就知道該方法是待測試方法,又好比@Before註解,程序看到這個註解,就知道該方法要放在@Test方法以前執行。
註解就像一個標籤,是貼在程序代碼上供另外一個程序讀取的。因此三者關係是程序員

Spring boot註解分析

註解就像標籤,是程序判斷執行的依據。好比,程序讀到@Test就知道這個方法是待測試方法,而@Before的方法要在測試方法以前執行
註解須要三要素:定義、使用、讀取並執行。
註解分爲自定義註解、JDK內置註解和第三方註解(框架)三種。自定義註解通常要咱們本身定義、使用、並寫程序讀取,而JDK內置註解和第三方註解咱們只要懂得使用,定義和讀取這些咱們交給它們,初學者別管太多,先攻城略地。
大多數狀況下,三角關係中咱們只負責使用註解,無需定義和執行,框架會將註解類和讀取註解的程序隱藏起來,除非閱讀源碼,不然根本看不到。平時見不到定義和讀取的過程,光顧着使用註解,這樣就很容易讓咱們忘了註解如何起做用了
Spring boot註解分析spring

格式

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

分類

大體分爲三類:自定義註解、JDK內置註解、還有第三方框架提供的註解。
自定義註解就是咱們本身寫的註解。JDK內置註解,好比@Override檢驗方法重載,@Deprecated標識方法過時等。第三方框架定義的註解好比SpringMVC的@Controller等。app

註解的優點

  • 註解能夠充分利用 Java 的反射機制獲取類結構信息,這些信息能夠有效減小配置的工做。如使用 JPA 註釋配置 ORM 映射時,咱們就不須要指定 PO 的屬性名、類型等信息,若是關係表字段和 PO 屬性名、類型都一致,您甚至無需編寫任務屬性映射信息——由於這些信息均可以經過 Java 反射機制獲取。
  • 註解和 Java 代碼位於一個文件中,而 XML 配置採用獨立的配置文件,大多數配置信息在程序開發完成後都不會調整,若是配置信息和 Java 代碼放在一塊兒,有助於加強程序的內聚性。而採用獨立的 XML 配置文件,程序員在編寫一個功能時,每每須要在程序文件和配置文件中不停切換,這種思惟上的不連貫會下降開發效率。

    反射

    在某種意義上,註解和反射實際上是很類似的。所謂反射實際上是Java 在程序運行時,對於任意一個類,都可以知道這個類的全部屬性和方法;而對於任意一個對象,都可以調用它的任意一個方法和屬性。這種動態的獲取信息以及動態調用對象的方法 的功能稱爲 java 的反射機制。
    反射機制很重要的一點就是「運行時」,其使得咱們能夠在程序運行時加載、探索以及使用編譯期間徹底未知的 .class 文件。換句話說,Java 程序能夠加載一個運行時才得知名稱的 .class 文件,而後獲悉其完整構造,並生成其對象實體、或對其 fields(變量)設值、或調用其 methods(方法)。框架

    Spring Boot 最核心的 3 個註解

    @Configuration

    Indicates that a class declares one or more @Bean methods and may be processed by the Spring container to generate bean definitions and service requests for those beans at runtime
    org.springframework.context.annotation.Configurationide

這是 Spring 3.0 添加的一個註解,用來代替 applicationContext.xml 配置文件,全部這個配置文件裏面能作到的事情均可以經過這個註解所在類來進行註冊。咱們不妨看看下面幾個相關注解也是很是重要的!學習

@Bean

Indicates that a method produces a bean to be managed by the Spring container.測試

用來代替 XML 配置文件裏面的 <bean ...> 配置。spa

@ImportResource

若是有些經過類的註冊方式配置不了的,能夠經過這個註解引入額外的 XML 配置文件,有些老的配置文件沒法經過 @Configuration 方式配置的很是管用。3d

@Import

用來引入額外的一個或者多個 @Configuration 修飾的配置文件類。

@SpringBootConfiguration

這個註解就是 @Configuration 註解的變體,只是用來修飾是 Spring Boot 配置而已,或者可利於 Spring Boot 後續的擴展,源碼以下。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

@ComponentScan

Configures component scanning directives for use with @Configuration classes. Provides support parallel with Spring XML’s <context:component-scan> element.
org.springframework.context.annotation.ComponentScan

這是 Spring 3.1 添加的一個註解,用來代替配置文件中的 component-scan 配置,開啓組件掃描,即自動掃描包路徑下的 @Component 註解進行註冊 bean 實例到 context 中。
另外,@ComponentScans 是可重複註解,便可以配置多個,用來配置註冊不一樣的子包。

@EnableAutoConfiguration

Enable auto-configuration of the Spring Application Context, attempting to guess and configure beans that you are likely to need. Auto-configuration classes are usually applied based on your classpath and what beans you have defined.
org.springframework.boot.autoconfigure.EnableAutoConfiguration

看全路徑就知道,這是自 Spring Boot 誕生時添加的註解,用來提供自動配置,上面的兩個都是 spring-context 包下的,不屬於 Spring Boot,因此 Spring 3.0 以後的去 XML 配置方式已經爲 Spring Boot 埋下了伏筆!

至於說@SpringBootApplication

其實這個 @SpringBootApplication 註解就包含了以上 3 個主要註解,平時沒有自定義配置的需求,則使用 @SpringBootApplication 註解徹底就能夠了!
讓咱們來看下 @SpringBootApplication 註解的源碼

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};
}

觀察下面這張圖,咱們能夠更加直觀切深入的感覺到SpringBootApplication的源碼中的注入依賴關係:)
Spring boot註解分析

參考資料:

  1. Spring Boot 最核心的 3 個註解詳解https://link.zhihu.com/?target=http%3A//www.imooc.com/article/254495
  2. Spring註解https://zhuanlan.zhihu.com/p/60941426
  3. spring註解學習https://www.jianshu.com/p/7905decddb8e
相關文章
相關標籤/搜索