Springboot注解分析

Spring Boot從一開始就告訴我們,她更喜歡基于Java的配置,即注解的方式。所以她提供了一大堆注解,并讓我們習慣使用注解。其最大的特點是無需 XML 配置文件,能自動掃描包路徑裝載并注入對象,并能做到根據(jù) classpath 下的 jar 包自動配置。這個過程摒棄了spring以往項目中大量繁瑣的配置,通過自身默認配置,極大的降低了項目搭建的復雜度。同樣在spring boot中,大量注解的使用,使得代碼看起來更加簡潔,提高開發(fā)的效率。這些注解不光包括spring boot自有,也有一些是繼承自spring的。

成都創(chuàng)新互聯(lián)專注于裕安企業(yè)網(wǎng)站建設,成都響應式網(wǎng)站建設公司,商城建設。裕安網(wǎng)站建設公司,為裕安等地區(qū)提供建站服務。全流程定制制作,專業(yè)設計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務

注解的作用

如果說注釋是寫給人看的,那么注解就是寫給程序看的。它更像一個標簽,貼在一個類、一個方法或者字段上。它的目的是為當前讀取該注解的程序提供判斷依據(jù)。比如程序只要讀到加了@Test的方法,就知道該方法是待測試方法,又比如@Before注解,程序看到這個注解,就知道該方法要放在@Test方法之前執(zhí)行。
注解就像一個標簽,是貼在程序代碼上供另一個程序讀取的。所以三者關系是

Spring boot注解分析

注解就像標簽,是程序判斷執(zhí)行的依據(jù)。比如,程序讀到@Test就知道這個方法是待測試方法,而@Before的方法要在測試方法之前執(zhí)行
注解需要三要素:定義、使用、讀取并執(zhí)行。
注解分為自定義注解、JDK內置注解和第三方注解(框架)三種。自定義注解一般要我們自己定義、使用、并寫程序讀取,而JDK內置注解和第三方注解我們只要懂得使用,定義和讀取這些我們交給它們,初學者別管太多,先攻城略地。
大多數(shù)情況下,三角關系中我們只負責使用注解,無需定義和執(zhí)行,框架會將注解類和讀取注解的程序隱藏起來,除非閱讀源碼,否則根本看不到。平時見不到定義和讀取的過程,光顧著使用注解,這樣就很容易讓我們忘了注解如何起作用了
Spring boot注解分析

格式

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

分類

大致分為三類:自定義注解、JDK內置注解、還有第三方框架提供的注解。
自定義注解就是我們自己寫的注解。JDK內置注解,比如@Override檢驗方法重載,@Deprecated標識方法過期等。第三方框架定義的注解比如SpringMVC的@Controller等。

注解的優(yōu)勢

  • 注解可以充分利用 Java 的反射機制獲取類結構信息,這些信息可以有效減少配置的工作。如使用 JPA 注釋配置 ORM 映射時,我們就不需要指定 PO 的屬性名、類型等信息,如果關系表字段和 PO 屬性名、類型都一致,您甚至無需編寫任務屬性映射信息——因為這些信息都可以通過 Java 反射機制獲取。
  • 注解和 Java 代碼位于一個文件中,而 XML 配置采用獨立的配置文件,大多數(shù)配置信息在程序開發(fā)完成后都不會調整,如果配置信息和 Java 代碼放在一起,有助于增強程序的內聚性。而采用獨立的 XML 配置文件,程序員在編寫一個功能時,往往需要在程序文件和配置文件中不停切換,這種思維上的不連貫會降低開發(fā)效率。

    反射

    在某種意義上,注解和反射其實是很相似的。所謂反射其實是Java 在程序運行時,對于任意一個類,都能夠知道這個類的所有屬性和方法;而對于任意一個對象,都能夠調用它的任意一個方法和屬性。這種動態(tài)的獲取信息以及動態(tài)調用對象的方法 的功能稱為 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.Configuration

這是 Spring 3.0 添加的一個注解,用來代替 applicationContext.xml 配置文件,所有這個配置文件里面能做到的事情都可以通過這個注解所在類來進行注冊。我們不妨看看下面幾個相關注解也是非常重要的!

@Bean

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

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

@ImportResource

如果有些通過類的注冊方式配置不了的,可以通過這個注解引入額外的 XML 配置文件,有些老的配置文件無法通過 @Configuration 方式配置的非常管用。

@Import

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

@SpringBootConfiguration

這個注解就是 @Configuration 注解的變體,只是用來修飾是 Spring Boot 配置而已,或者可利于 Spring Boot 后續(xù)的擴展,源碼如下。

@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 配置方式已經(jīng)為 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

當前文章:Springboot注解分析
標題網(wǎng)址:http://bm7419.com/article18/jcigdp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、App開發(fā)自適應網(wǎng)站、虛擬主機動態(tài)網(wǎng)站、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)