中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring boot注解分析

發布時間:2020-07-04 22:07:07 來源:網絡 閱讀:1047 作者:yerikyu 欄目:編程語言

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

注解的作用

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

Spring boot注解分析

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

格式

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

分類

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

注解的優勢

  • 注解可以充分利用 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.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 后續的擴展,源碼如下。

@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
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

马龙县| 偃师市| 土默特右旗| 洛扎县| 抚顺县| 定远县| 辽阳市| 安泽县| 景东| 凤城市| 图木舒克市| 遵化市| 大理市| 郓城县| 沙雅县| 兰考县| 织金县| 松阳县| 金塔县| 张北县| 东台市| 尤溪县| 建始县| 崇左市| 武威市| 丁青县| 类乌齐县| 盱眙县| 常州市| 洪江市| 新密市| 磐安县| 张家港市| 锡林郭勒盟| 金坛市| 定边县| 永平县| 利津县| 视频| 柘城县| 逊克县|