我想,每個開發人員都應該有過這樣的經歷:在編寫某個類或接口的時候,需要聲明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註解的全部含義了。