@SpringBootApplication注解用在Spring Boot的入口類上面,是Spring Boot提供的應用啟動相關的注解。
直接上注解的源碼:
@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, attribute = "exclude") Class<?>[] exclude() default {}; @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "excludeName") String[] excludeName() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] scanBasePackages() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") Class<?>[] scanBasePackageClasses() default {};
}
@SpringBootApplication是一個復合注解
查看源碼,可以發現@SpringBootApplication是一個復合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan三個注解。
對這三個注解進行逐一解析:
@SpringBootConfiguration
@SpringBootConfiguration繼承自@Configuration,二者的功能也一致,用於標注當前類是配置類,並且會將當前類內聲明的一個或多個以@Bean注解標記的方法的實例納入到Spring容器中,且實例名就是方法名。
@SpringBootConfiguration和@Configuration都可以理解為Spring傳統XML配置里的<beans>標簽,而@Bean則是<bean>標簽。
@Configuration和@Bean並不是Spring Boot的特有標簽,普通的Spring項目也可以使用,只是普通的Spring項目在使用大多數注解的時候要掃包才能生效,要注意加上掃包配置<context:component-scan base-package="com.yanggb.xxx" />。而Spring Boot只需要保證啟動啟動main入口在這些類的上層包就行,不需要特別加上掃包配置。
Spring傳統XML配置:
<beans> <bean id="car" class="com.yanggb.Car"> <property name="wheel" ref="wheel"></property> </bean> <bean id="wheel" class="com.yanggb.Wheel"></bean> </beans>
Spring新型注解配置:
@Configuration // 相當於<beans> public class CarConfig { @Bean // 相當於<bean> public Car car() { Car car = new Car(); car.setWheel(wheel()); // 相當於<property> return car; } @Bean public Wheel wheel() { return new Wheel(); }
}
兩種方式最后產生的結果是相同的。
@EnableAutoConfiguration
@EnableAutoConfiguration的作用是啟動自動配置,意思是Spring Boot會根據你添加的jar包來配置你項目的默認設置,比如你添加了Spring Boot提供的spring-boot-starter-web依賴,其中包含了Tomcat和Spring MVC,這個注釋就會假設你正在開發一個Web應用程序,自動地幫你添加Web項目中所需要的Spring配置。
@ComponentScan
@ComponentScan的作用是掃描當前包及其子包下被@Component注解標記的類並納入到Spring容器中進行管理。是Spring傳統XML配置的<context:component-scan>的替代。
@Controller,@Service,@Repository是@Component的子注解,所以也會被@ComponentScan掃描並做和@Component相同的處理。
@ComponentScan提供了basePackage參數定義要掃描的包,如果不設置,默認會掃描包的所有類,即默認掃描**/*.class路徑,建議加上該參數以減少加載的時間。
@SpringBootApplication提供的參數
exclude
exlude參數繼承自@EnableAutoConfiguration注解的同名參數,根據class來排除特定的類加入Spring容器,傳入參數的value類型是class類型數組。
@SpringBootApplication(exclude = {Good.class, Bad.class})
excludeName
exludeName參數繼承自@EnableAutoConfiguration注解的同名參數,根據className來排除特定的類加入Spring容器,傳入參數的value類型是class的全類名字符串數組。
@SpringBootApplication(excludeName = {"com.yanggb.xxx.Good", "com.yanggb.yyy.Bad"})
exclude和excludeName可以用來關閉指定的自動配置,比如關閉數據源相關的自動配置。
scanBasePackages
scanBasePackages參數繼承自@ComponentScan注解的basePackages參數,指定要掃描的包,傳入參數的value類型是包名的字符串數組。
@SpringBootApplication(scanBasePackages = {"com.yanggb.xxx", "com.yanggb.yyy"})
scanBasePackageClasses
scanBasePackageClasses參數繼承自@ComponentScan注解的basePackageClasses參數,指定要掃描的包,傳入參數的value類型是包名的字符串數組。
@SpringBootApplication(scanBasePackageClasses = {Good.class, Bad.class})
"到后來,我們只是會說對此無能為力。"