您好,登錄后才能下訂單哦!
Spring Boot從一開始就告訴我們,她更喜歡基于Java的配置,即注解的方式。所以她提供了一大堆注解,并讓我們習慣使用注解。其最大的特點是無需 XML 配置文件,能自動掃描包路徑裝載并注入對象,并能做到根據 classpath 下的 jar 包自動配置。這個過程摒棄了spring以往項目中大量繁瑣的配置,通過自身默認配置,極大的降低了項目搭建的復雜度。同樣在spring boot中,大量注解的使用,使得代碼看起來更加簡潔,提高開發的效率。這些注解不光包括spring boot自有,也有一些是繼承自spring的。
如果說注釋是寫給人看的,那么注解就是寫給程序看的。它更像一個標簽,貼在一個類、一個方法或者字段上。它的目的是為當前讀取該注解的程序提供判斷依據。比如程序只要讀到加了@Test的方法,就知道該方法是待測試方法,又比如@Before注解,程序看到這個注解,就知道該方法要放在@Test方法之前執行。
注解就像一個標簽,是貼在程序代碼上供另一個程序讀取的。所以三者關系是
注解就像標簽,是程序判斷執行的依據。比如,程序讀到@Test就知道這個方法是待測試方法,而@Before的方法要在測試方法之前執行
注解需要三要素:定義、使用、讀取并執行。
注解分為自定義注解、JDK內置注解和第三方注解(框架)三種。自定義注解一般要我們自己定義、使用、并寫程序讀取,而JDK內置注解和第三方注解我們只要懂得使用,定義和讀取這些我們交給它們,初學者別管太多,先攻城略地。
大多數情況下,三角關系中我們只負責使用注解,無需定義和執行,框架會將注解類和讀取注解的程序隱藏起來,除非閱讀源碼,否則根本看不到。平時見不到定義和讀取的過程,光顧著使用注解,這樣就很容易讓我們忘了注解如何起作用了
public @interface 注解名稱{
屬性列表;
}
大致分為三類:自定義注解、JDK內置注解、還有第三方框架提供的注解。
自定義注解就是我們自己寫的注解。JDK內置注解,比如@Override檢驗方法重載,@Deprecated標識方法過期等。第三方框架定義的注解比如SpringMVC的@Controller等。
在某種意義上,注解和反射其實是很相似的。所謂反射其實是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.Configuration
這是 Spring 3.0 添加的一個注解,用來代替 applicationContext.xml 配置文件,所有這個配置文件里面能做到的事情都可以通過這個注解所在類來進行注冊。我們不妨看看下面幾個相關注解也是非常重要的!
Indicates that a method produces a bean to be managed by the Spring container.
用來代替 XML 配置文件里面的 <bean ...> 配置。
如果有些通過類的注冊方式配置不了的,可以通過這個注解引入額外的 XML 配置文件,有些老的配置文件無法通過 @Configuration 方式配置的非常管用。
用來引入額外的一個或者多個 @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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。