- Spring Boot開發實戰
- 陳光劍
- 1187字
- 2019-01-05 10:00:24
2.4 Spring Boot應用注解@Spring BootApplication
我們在上面看到在Spring Boot入口類上面添加了注解@Spring BootApplication,這個注解的定義如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Spring BootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExclu deFilter.class) }) public @interface Spring BootApplication {...}
@Spring BootApplication注解實際上封裝了以下三個注解:
?@Spring BootConfiguration:配置類注解。
?@EnableAutoConfiguration:啟用自動配置注解。
?@ComponentScan:組件掃描注解。
下面我們分別來介紹。
2.4.1 Spring Boot配置類注解
@SpringBootConfiguration與@Component注解是一樣的。@SpringBootConfiguration其實是Spring Boot包裝的@Configuration注解:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface Spring BootConfiguration { }
而@Configuration注解使用的又是@Component注解:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Configuration { @AliasFor(annotation = Component.class) String value() default ""; }
我們知道,@Component注解的功能是把普通POJO實例化到Spring容器中,相當于配置文件中的<bean id = ""class = ""/>。
在類上添加注解@Configuration,表明這個類代表一個Spring配置文件,與原來XML配置是等效的。只不過現在用Java類加上一個@Configuration注解進行配置了,這種方式與XML相比可以稱得上是極簡風格了。同時基于注解的配置風格,使得代碼的可讀性也大大增高了。
Spring容器可以掃描出任何我們添加了@Component注解的類,Bean的注冊邏輯在Class-PathScanningCandidateComponentProvider這個類的registerDefaultFilters方法里。
提示
注解(Annotation)是JDK1.5中引入的一個新特性。從Spring2.0以后的版本中,Spring引入了基于注解方式的配置,用于取代XML配置文件,從而極簡化了Bean的配置,Spring后來的新版本。在Spring Boot中完全采用基于注解(Spring4.x引入了更加智能的@Condition系列注解,我們將會在后面的章節中詳細介紹)的配置,實現“零XML的配置”(當然,同時也支持之前的XML配置文件方式)。
2.4.2 啟用自動配置注解
@EnableAutoConfiguration這個注解是Spring Boot的最核心注解。首先我們看它的定義:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {...}
其中,導入配置類注解@Import標識導入@Configuration標注的配置類。@Import用來整合所有在@Configuration注解中定義的Bean配置。這與我們將多個XML配置文件導入到單個文件的場景一致。@Import注解實現了相同的功能。
使用@EnableAutoConfiguration注解可以啟用Spring應用程序上下文的自動配置,Spring Boot會去嘗試猜測和配置你可能需要的Bean。自動配置類通常是根據類路徑中你定義的Bean來推斷可能需要怎樣的配置。
例如,如果在你的類路徑中有tomcat-embedded.jar這個類庫,那么Spring Boot會根據此信息來判斷你可能需要一個TomcatServletWebServerFactory(除非你已經定義了你自己的ServletWebServerFactory Bean)。當然我們還可以通過設置exclude或者excludeName變量的值來手動排除你不想要的自動配置。
Spring Boot默認掃描的包路徑是入口類Demo0HelloWorldApplication所在的根包中,及其所有的子包。通常,Spring Boot自動配置Bean是根據Conditional Bean(條件Bean)中注解的類信息來推斷的。例如@ConditionalOnClass、@ConditionalOnMissingBean注解。關于Spring Boot自動配置的相關內容我們將在后面的章節中詳細介紹。
2.4.3 組件掃描注解
組件掃描注解@ComponentScan提供的功能與Spring XML配置文件中的<context:component-scan>元素等價。對應@ComponentScan注解的處理類是ConfigurationClassParser。@ComponentScan告訴Spring去哪個package下面掃描Spring注解。Spring會去自動掃描這些被Spring注解標注的類,并且將其注冊到Bean容器中。例如下面的XML配置:
<beans> <context:component-scan base-package="com.easy.SpringBoot" name-generator="com.easy.SpringBoot.MyApp" /> </beans>
對應到Java Config風格如下:
@Configuration @ComponentScan(basePackages = "com.easy.SpringBoot", nameGenerator = MyApp.class)
public class AppConfig { . }
如果你有個類用@Controller注解標識了,但是沒有加上@ComponentScan告訴Spring去掃描這個類所在的包,那么該Controller就不會被注冊到Spring容器中。
不過,Spring Boot中如果不顯式地使用@ComponentScan指明對象掃描的包,那么默認只掃描當前啟動類所在的包里的類。
我們可以設置basePackageClasses的值來指定要掃描哪個類所在的包,代碼示例如下:
@Spring BootApplication @ComponentScan(basePackageClasses=MyApplication.class) //指定掃描MyApplication //類所在的包 public class MyApplication { public static void main(String[] args){ SpringApplication.run(MyApplication.class, args); } }