spring-boot-starter-web:spring-boot-starter:spring-boot場景啟動器;幫我們導入了web模塊 正常運行所依賴的組件; Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啟動器), 只需要在項目裡面引入這些starter ...
程式中的pom.xml文件:
一、父級標簽
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> </parent>
這是一個父級標簽:讓我們點擊org.springframework.boot就會查看到他的父級的依賴:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.5.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent>
就會發現它才是真正的SpringBoot的版本控制中心,這樣一來我們在導入
依賴的時候就不需要寫導入的版本號了,但是如果不在dependencies裡面
管理的依賴還是需要進行版本號的輸入的。
二、依賴標簽(啟動器)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
spring-boot-starter:spring-boot場景啟動器;幫我們導入了web模塊
正常運行所依賴的組件;
Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啟動器),
只需要在項目裡面引入這些starter相關場景的所有依賴都會導入進來。要用什麼
功能就導入什麼場景的啟動器。
例如:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
這是一個test(測試用的)啟動器,我們要用的是測試功能,導入測試場景的啟動器就可以了。
程式中的主程式文件:
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
@SpringBootApplication:Spring Boot應用標註在某個類上說明這個類是SpringBoot的主配置類,
SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用;
我們接下來就研究一下這個@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 {
1)、@SpringBootConfiguration:SpringBoot的配置類,標註在哪個類上面就代表這個類就是一個SpringBoot
的配置類,我們點進這個註解(@SpringBootConfiguration)裡面看一下:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
我們看到了這個@Configuration註解,這就證明瞭SpringBootConfiguration 就是一個配置類,再點進到這個註解
(@Configuration)裡面看一下:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Configuration { @AliasFor( annotation = Component.class ) String value() default ""; }
我們看到了@Component這個註解,證明瞭配置類也是容器中的一個組件。
2)、@EnableAutoConfiguration:開啟自動配置,這樣一來我們需要的所有配置,SpringBoot都將幫我們
配置完成,我們點進去這個註解(@EnableAutoConfiguration)看一看:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {}; }
這裡面有這兩個重要的註解(@AutoConfigurationPackage與@Import({AutoConfigurationImportSelector.class}))
先研究一下這個註解(@AutoConfigurationPackage)這是自動配置包的意思我們點進去看一下這個註解:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import({Registrar.class}) public @interface AutoConfigurationPackage { }
裡面有一個@Import({Registrar.class})註解,這是Spring底層的註解,是導入一個組件的意思,導入的組件由
Registrar.class將主配置類(也就是SpringBootApplication標註的類)的所在層級以及該層級以下所有層級的
所有組件都掃描到Spring的容器中。
接下來我們研究一下這個註解(@Import({AutoConfigurationImportSelector.class}))這是一個給容器中導入組件的
一個註解,AutoConfigurationImportSelector:導入哪些組件的選擇器;將所有需要導入的組件以全類名的方式返回;
這些組件就會被添加到容器中;會給容器中導入非常多的自動配置類(xxxAutoConfiguration);就是給容器中導入
這個場景需要的所有組件,並配置好這些組件;下麵是源碼(AutoConfigurationImportSelector這個類下麵的getAutoConfigurationImportFilters的方法):
protected List<AutoConfigurationImportFilter> getAutoConfigurationImportFilters() { return SpringFactoriesLoader.loadFactories(AutoConfigurationImportFilter.class, this.beanClassLoader); }
我們進入到SpringFactoriesLoader中看一下:這個是載入properties屬性文件的方法
public abstract class SpringFactoriesLoader { public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories"; private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class); private static final Map<ClassLoader, MultiValueMap<String, String>> cache = new ConcurrentReferenceHashMap(); public SpringFactoriesLoader() { }
我們看到所加在的properties文件的路徑是META-INF/spring.factories,我們找一下這個文件的位置看一下裡面都有什麼:
Spring Boot在啟動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為
自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作;
J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-2.0.5.RELEASE.jar;中