SpringCloud基於SpringBoot,所以在啓動時也需要以下代碼進行啓動。
SpringApplication.run(xxxApplication.class,arg);
點進去註解內可以看到有七個註解
他們分別有各自的作用:分爲四個元註解和三個配置引導註解。
四大元註解
-
Target(ElementType.TYPE)
它的作用就是:指示註釋類型適用的上下文,指明瞭修飾的這個註解的使用範圍,即被描述的註解可以用在哪裏,它裏面有一個ElementType類,內部有8個值。
-
TYPE:類,接口或者枚舉
-
FIELD:域,包含枚舉常量
-
METHOD:方法
-
PARAMETER:參數
-
CONSTRUCTOR:構造方法
-
LOCAL_VARIABLE:局部變量
-
ANNOTATION_TYPE:註解類型
-
PACKAGE:包
-
-
@Documented
它的意思就是表示默認情況下,該註解該由javadoc工具記錄,默認情況下javadoc是不包括註解的,但如果聲明註解時指定了@Documented,它會被javadoc之類的工具處理,所以註解類型信息也會被包括在生成的文檔中,只負責標記,沒有成員取值。
-
@Retention(RetentionPolicy.RUNTIME)
它的意思是指你要保留地註解的生命週期,會保留到哪個階段,它的參數RetentionPolicy是一個類,內部定義了三個參數:1. SOURCE 2. CLASS 3. RUNTIME ,他們三個的作用就是配合@Retention來定義保留的時間。
3.1 SOURCE:源碼級別保留,編譯後即丟棄
3.2 CLASS:變異級別保留,變異後的class文件中存在,在jvm運行時丟棄,這是默認值。
3.3 RUNTIME:運行級別保留,編譯後的class文件中存在,在jvm運行時保留,可以被反射調用。
-
@Inherited
簡單來說:它是一個標記註解,某個子類使用了它,就能通過它來獲取到父類的註解。
這是它的中文文檔:
指示註釋類型被自動繼承。如果在註釋類型聲明中存在 Inherited 元註釋,並且用戶在某一類聲明中查詢該註釋類型,同時該類聲明中沒有此類型的註釋,則將在該類的超類中自動查詢該註釋類型。此過程會重複進行,直到找到此類型的註釋或到達了該類層次結構的頂層 (Object) 爲止。如果沒有超類具有該類型的註釋,則查詢將指示當前類沒有這樣的註釋。
注意,如果使用註釋類型註釋類以外的任何事物,此元註釋類型都是無效的。還要注意,此元註釋僅促成從超類繼承註釋;對已實現接口的註釋無效。
三大配置引導註解
@SpringBootConfiguration
該註解它的裏面有一個@Configuration,他的作用就是用來聲明當前類是個配置類,可以通過@Bean註解生成IOC容器管理的Bean。
而他的文檔意思就是:
@SpringBootConfiguration來替代@Configuration,以便可以自動找到配置
@EnableAutoConfiguration
它的裏面有兩個註解分別是:
@AutoConfigurationPackage 和 Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
的中文文檔是:指示應註冊包含帶註釋的類的包。
@Import(AutoConfigurationPackages.Registrar.class)
的文檔意思是:
表示要導入的一個或多個@Configuration類。
@EnableAutoConfiguration
是springboot實現自動化配置的核心註解,通過這個註解把spring應用所需的bean注入容器中.@EnableAutoConfiguration
源碼通過@Import
注入了一個ImportSelector
的實現類
@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
.