spring boot簡化了spring的開發,是J2EE一站式解決方案。css
入門容易,精通難;由於不少事情是spring boot自動完成的。html
martin flow 《Microservices》java
/** * @SpringBootApplication 用來告訴程序這是一個 spring boot 應用 */ @SpringBootApplication public class Helloworld { public static void main(String[] args) { // 啓動Spring應用 SpringApplication.run(Helloworld.class, args); } }
controller類spring
@Controller public class HelloController { @ResponseBody @RequestMapping("/hello") public String hello(){ return "Hello world"; } }
<!-- spring boot 全部spring boot starter的父項目 是真正管理spring boot應用中全部依賴版本 是spring boot的版本仲裁中心(決定依賴庫的版本) 之後咱們導入依賴默認是不須要寫版本的(可是那些沒有在父項目中管理的依賴天然是須要聲明版本號的)--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> </parent> <dependencies> <!--開發web應用須要的庫--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!--將應用打包爲jar包--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
/** * @SpringBootApplication 用來告訴程序這是一個 spring boot 應用 */ @SpringBootApplication public class Helloworld { public static void main(String[] args) { // 啓動Spring應用 SpringApplication.run(Helloworld.class, args); } }
@SpringBootApplication 註解標註在某個類上的時候,說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啓動SpringBoot應用。該註解爲組合註解,由如下註解組成:springboot
// 指定該註解能夠給一個類型進行註解,好比類、接口、枚舉 @Target(ElementType.TYPE) // 註解能夠保留到程序運行的時候,它會被加載進入到 JVM 中,因此在程序運行時能夠獲取到它們。 @Retention(RetentionPolicy.RUNTIME) // 它的做用是可以將註解中的元素包含到 Javadoc 中去。 @Documented // 若是一個超類被 @Inherited 註解過的註解進行註解的話,那麼若是它的子類沒有被任何註解應用的話,那麼這個子類就繼承了超類的註解。 @Inherited // 代表這個類是一個SpringBoot的配置類 @SpringBootConfiguration // 告訴SpringBoot開啓自動配置功能,自動配置纔會生效 @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication {}
@SpringBootConfiguration 標記在某個類上時,代表這個類是一個SpringBoot的配置類。其組成爲:app
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration {}
其中,@Configuration註解是Spring框架中基本的一個註解,在配置類上標記該註解,代表這個類是Spring的配置類。框架
@EnableAutoConfiguration告訴SpringBoot開啓自動配置功能,這樣自動配置才能生效。其組成爲:jsp
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {}
其中 @AutoConfigurationPackage自動配置包,將主配置類(即@SpringBootApplication標註的類)所在包及其下面全部子包裏面的全部組件掃描到Spring容器中。其組成爲:maven
@Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage {}
@Import爲Spring的底層註解,代表給容器中導入一個組件,導入的組建由AutoConfigurationPackages.Registrar類提供。
@Import(AutoConfigurationImportSelector.class) 代表開啓自動導入哪些組建的選擇器;
AutoConfigurationImportSelector.class將要導入的組件以全類名的方式返回,這些容器會被導入到Spring容器。會給容器中導入很是多的自動配置類(通常以xxxAutoConfiguration結尾)。這些自動配置類的做用就是給容器中導入場景所需的自動配置,有了自動配置類,就能夠不用手動寫配置了
自動配置類是怎麼找到的呢?
AutoConfigurationImportSelector - selectImports(AnnotationMetadata annotationMetadata) - List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); // 返回全部配置,對應上面的圖 - List<String> configurations = SpringFactoriesLoader.loadFactoryNames( getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()); - protected Class<?> getSpringFactoriesLoaderFactoryClass() { return EnableAutoConfiguration.class; } - String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; - Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
從類路徑下(如引用的各個jar包)的 META-INF/spring.factories中獲取 EnableAutoConfiguration制定的值(自動配置類),這些值做爲自動配置類導入到容器中,自動配置類就生效了,幫咱們進行自動配置工做。之前咱們須要本身配置的類,spring boot都自動配置了:
spring-boot-autoconfigure包中,包含了J2EE 全部整合方案和全部自動配置。
org\springframework\boot\spring-boot-autoconfigure\1.5.9.RELEASE\spring-boot-autoconfigure-1.5.9.RELEASE.jar!\org\springframework\boot\autoconfigure
resources 文件夾中目錄結構: