Spring源碼---組合註解 @SpringBootApplication

 我想,每個開發人員都應該有過這樣的經歷:在編寫某個類或接口的時候,需要聲明Spring本身的註解(@Controller、@Service,@Dao),又需要聲明自己公司編寫的註解來完成公司的獨特業務,然後就悲劇了,一個類上邊聲明瞭五六個註解,茫茫然不知所云。註解本身是好的,它可以替我們完成一些事情。但和XML一樣,過度使用就編程了一種災難。

     於是,一種新的替代方案出現了,那就是組合註解。比較經典的組合註解就是SpringBoot的@SpringBootApplication註解。我們看看它的源碼: 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {
 
 
    Class<?>[] exclude() default {};
 
 
    String[] excludeName() default {};
 
 
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};
 
 
    @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
    Class<?>[] scanBasePackageClasses() default {};
 
}


      我們可以大致看看它包含哪些功能:

          第一點,它本身是個註解,提供了exclude()和excludeName()兩個註解屬性;

          第二點,它聲明瞭@ComponentScan註解,同時是@ComponentScan註解的容器。我們發現scanBasePackages和scanBasePackageClasses兩個註解屬性上面同樣聲明瞭@AliasFor註解,分別指向了@ComponentScan註解的basePackages註解屬性和basePackageClasses屬性。

          第三點,它聲明瞭@Configuration註解,表明聲明瞭它的類本身也是個配置類。

          第四點,它聲明瞭@EnableAutoConfiguration註解,表明聲明瞭它的類本身會默認開啓自動配置

          第五點,它聲明瞭@Inherited註解,表明聲明瞭它的類的子類是可以繼承它的。

       以上,就是@SpringBootApplication註解的全部含義了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章