SpringCloud之@SpringBootApplication


SpringCloud基於SpringBoot,所以在啟動時也需要以下代碼進行啟動。

  SpringApplication.run(xxxApplication.class,arg);

點進去注解內可以看到有七個注解

 

  

 

他們分別有各自的作用:分為四個元注解和三個配置引導注解。

 

 

四大元注解

  

  1. Target(ElementType.TYPE)

    它的作用就是:指示注釋類型適用的上下文,指明了修飾的這個注解的使用范圍,即被描述的注解可以用在哪里,它里面有一個ElementType類,內部有8個值。

    • TYPE:類,接口或者枚舉

    • FIELD:域,包含枚舉常量

    • METHOD:方法

    • PARAMETER:參數

    • CONSTRUCTOR:構造方法

    • LOCAL_VARIABLE:局部變量

    • ANNOTATION_TYPE:注解類型

    • PACKAGE:包

     

  2. @Documented

    它的意思就是表示默認情況下,該注解該由javadoc工具記錄,默認情況下javadoc是不包括注解的,但如果聲明注解時指定了@Documented,它會被javadoc之類的工具處理,所以注解類型信息也會被包括在生成的文檔中,只負責標記,沒有成員取值。

     

  3. @Retention(RetentionPolicy.RUNTIME)

    它的意思是指你要保留地注解的生命周期,會保留到哪個階段,它的參數RetentionPolicy是一個類,內部定義了三個參數:1. SOURCE 2. CLASS 3. RUNTIME ,他們三個的作用就是配合@Retention來定義保留的時間。

    3.1 SOURCE:源碼級別保留,編譯后即丟棄

    3.2 CLASS:變異級別保留,變異后的class文件中存在,在jvm運行時丟棄,這是默認值。

    3.3 RUNTIME:運行級別保留,編譯后的class文件中存在,在jvm運行時保留,可以被反射調用。

     

  4. @Inherited

    簡單來說:它是一個標記注解,某個子類使用了它,就能通過它來獲取到父類的注解。

    這是它的中文文檔:

指示注釋類型被自動繼承。如果在注釋類型聲明中存在 Inherited 元注釋,並且用戶在某一類聲明中查詢該注釋類型,同時該類聲明中沒有此類型的注釋,則將在該類的超類中自動查詢該注釋類型。此過程會重復進行,直到找到此類型的注釋或到達了該類層次結構的頂層 (Object) 為止。如果沒有超類具有該類型的注釋,則查詢將指示當前類沒有這樣的注釋。

注意,如果使用注釋類型注釋類以外的任何事物,此元注釋類型都是無效的。還要注意,此元注釋僅促成從超類繼承注釋;對已實現接口的注釋無效。

 

 

  

三大配置引導注解

 

  

  1. @SpringBootConfiguration

    該注解它的里面有一個@Configuration,他的作用就是用來聲明當前類是個配置類,可以通過@Bean注解生成IOC容器管理的Bean。

    而他的文檔意思就是:

    @SpringBootConfiguration來替代@Configuration,以便可以自動找到配置

     

  2. @EnableAutoConfiguration

    它的里面有兩個注解分別是:

    @AutoConfigurationPackageImport(AutoConfigurationImportSelector.class)

    @AutoConfigurationPackage的中文文檔是:指示應注冊包含帶注釋的類的包。

    @Import(AutoConfigurationPackages.Registrar.class)的文檔意思是:

    表示要導入的一個或多個@Configuration類。

     

    @EnableAutoConfiguration是springboot實現自動化配置的核心注解,通過這個注解把spring應用所需的bean注入容器中.@EnableAutoConfiguration源碼通過@Import注入了一個ImportSelector的實現類

     

  3. @ComponentScan

    它在文檔中是這樣的:

    @ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM,
              classes = AutoConfigurationExcludeFilter.class) })

    其中excludeFilters()這個方法作用就是:指定哪些類型不符合組件掃描的條件

    @Filter注解作用為類型過濾器。

    所以除去過濾掉的類型外,其他所有的類型都會被掃描到.

     

    懂Spring的都知道Spring的四大注解:@Service,@Repository,@Component,@Controller

    用來定義一個Bean,而@ComponentScan basePackages,includeFilters,excludeFilters屬性來動態確定自動掃描范圍,類型已經不掃描的類型.默認情況下:它掃描所有類型,並且掃描范圍是@ComponentScan注解所在配置類包及子包的類

 

總結:

通過上面可以得出springboot是通過注解@EnableAutoConfiguration的方式,去查找,過濾,加載所需的configuration,@ComponentScan掃描我們自定義的bean,@SpringBootConfiguration使得被@SpringBootApplication注解的類聲明為注解類.因此@SpringBootApplication的作用等價於同時組合使用@EnableAutoConfiguration@ComponentScan@SpringBootConfiguration

 

若是有什么不對的地方歡迎各位大佬指出來︿( ̄︶ ̄)︿

 

參考鏈接:

https://www.jianshu.com/p/39ee4f98575c

https://latty.iteye.com/blog/2371766

https://www.cnblogs.com/hzhuxin/p/7799899.html

 


免責聲明!

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



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