Spring Boot從一開始就告訴咱們,她更喜歡基於Java的配置,即註解的方式。因此她提供了一大堆註解,並讓咱們習慣使用註解。其最大的特色是無需 XML 配置文件,能自動掃描包路徑裝載並注入對象,並能作到根據 classpath 下的 jar 包自動配置。這個過程摒棄了spring以往項目中大量繁瑣的配置,經過自身默認配置,極大的下降了項目搭建的複雜度。一樣在spring boot中,大量註解的使用,使得代碼看起來更加簡潔,提升開發的效率。這些註解不光包括spring boot自有,也有一些是繼承自spring的。java
若是說註釋是寫給人看的,那麼註解就是寫給程序看的。它更像一個標籤,貼在一個類、一個方法或者字段上。它的目的是爲當前讀取該註解的程序提供判斷依據。好比程序只要讀到加了@Test的方法,就知道該方法是待測試方法,又好比@Before註解,程序看到這個註解,就知道該方法要放在@Test方法以前執行。
註解就像一個標籤,是貼在程序代碼上供另外一個程序讀取的。因此三者關係是程序員
註解就像標籤,是程序判斷執行的依據。好比,程序讀到@Test就知道這個方法是待測試方法,而@Before的方法要在測試方法以前執行
註解須要三要素:定義、使用、讀取並執行。
註解分爲自定義註解、JDK內置註解和第三方註解(框架)三種。自定義註解通常要咱們本身定義、使用、並寫程序讀取,而JDK內置註解和第三方註解咱們只要懂得使用,定義和讀取這些咱們交給它們,初學者別管太多,先攻城略地。
大多數狀況下,三角關係中咱們只負責使用註解,無需定義和執行,框架會將註解類和讀取註解的程序隱藏起來,除非閱讀源碼,不然根本看不到。平時見不到定義和讀取的過程,光顧着使用註解,這樣就很容易讓咱們忘了註解如何起做用了
spring
public @interface 註解名稱{ 屬性列表; }
大體分爲三類:自定義註解、JDK內置註解、還有第三方框架提供的註解。
自定義註解就是咱們本身寫的註解。JDK內置註解,好比@Override檢驗方法重載,@Deprecated標識方法過時等。第三方框架定義的註解好比SpringMVC的@Controller等。app
在某種意義上,註解和反射實際上是很類似的。所謂反射實際上是Java 在程序運行時,對於任意一個類,都可以知道這個類的全部屬性和方法;而對於任意一個對象,都可以調用它的任意一個方法和屬性。這種動態的獲取信息以及動態調用對象的方法 的功能稱爲 java 的反射機制。
反射機制很重要的一點就是「運行時」,其使得咱們能夠在程序運行時加載、探索以及使用編譯期間徹底未知的 .class 文件。換句話說,Java 程序能夠加載一個運行時才得知名稱的 .class 文件,而後獲悉其完整構造,並生成其對象實體、或對其 fields(變量)設值、或調用其 methods(方法)。框架
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 配置文件,全部這個配置文件裏面能作到的事情均可以經過這個註解所在類來進行註冊。咱們不妨看看下面幾個相關注解也是很是重要的!學習
Indicates that a method produces a bean to be managed by the Spring container.測試
用來代替 XML 配置文件裏面的 <bean ...> 配置。spa
若是有些經過類的註冊方式配置不了的,能夠經過這個註解引入額外的 XML 配置文件,有些老的配置文件沒法經過 @Configuration 方式配置的很是管用。3d
用來引入額外的一個或者多個 @Configuration 修飾的配置文件類。
這個註解就是 @Configuration 註解的變體,只是用來修飾是 Spring Boot 配置而已,或者可利於 Spring Boot 後續的擴展,源碼以下。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
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 是可重複註解,便可以配置多個,用來配置註冊不一樣的子包。
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 註解就包含了以上 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 最核心的 3 個註解詳解https://link.zhihu.com/?target=http%3A//www.imooc.com/article/254495
- Spring註解https://zhuanlan.zhihu.com/p/60941426
- spring註解學習https://www.jianshu.com/p/7905decddb8e