1、Spring Boot简介 简化Spring应用开发的一个框架
整个Spring技术栈的一个大整合
J2EE开发的一站式解决方案
2、微服务 2014,Martin Fowler 微服务论文
微服务:架构风格(服务微化)
每一个功能元素最终都是一个可独立替换和独立升级的软件单元
一个应用应该是一组小型服务:可以通过HTTP的方式进行互通
通常跟微服务相对的是单体应用,即将所有功能都打包成在一个独立单元的应用程序。
环境约束(我的开发环境):
JDK8:java version “1.8.0_131”
Maven3.x:Apache Maven 3.6.3
IntelliJ IDEA2019.2
SpringBoot 1.5.9.RELEASE
3、Spring Boot HelloWorld 一个功能:浏览器发送请求,服务器接收请求并处理,响应”Hello World”字符串
3.1 创建一个Maven工程 3.2 导入依赖Spring Boot相关的依赖 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <parent > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-parent</artifactId > <version > 1.5.9.RELEASE</version > </parent > <dependencies > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-web</artifactId > </dependency > </dependencies >
3.3 编写一个主程序 启动Spring Boot应用
1 2 3 4 5 6 7 8 9 10 11 12 @SpringBootApplication @RestController public class DemoApplication { public static void main (String[] args) { SpringApplication.run(DemoApplication.class , args ) ; } @GetMapping ("/hello" ) public String hello (@RequestParam(value = "name" , defaultValue = "World" ) String name) { return String.format("Hello %s!" , name); } }
3.4 编写相关的Controller、Service层 3.5 运行主程序测试 3.6 简化部署 Spring官方部署文档
1 2 3 4 5 6 7 8 9 <build > <plugins > <plugin > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-maven-plugin</artifactId > </plugin > </plugins > </build >
要运行该应用程序,请使用java -jar命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 $ java -jar target/myproject-0 .0.1 -SNAPSHOT .jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | ' _ | '_| | ' _ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.5.9.RELEASE) ....... . . . ....... . . . (log output here) ....... . . . ........ Started Example in 2.536 seconds (JVM running for 2.864)
4、Hello World探究 4.1 POM文件 父项目
1 2 3 4 5 <parent > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-parent</artifactId > <version > 1.5.9.RELEASE</version > </parent >
Ctrl+鼠标左键查看底层源码,上面这个父项目还依赖于
1 2 3 4 5 6 <parent > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-dependencies</artifactId > <version > 1.5.9.RELEASE</version > <relativePath > ../../spring-boot-dependencies</relativePath > </parent >
实现真正管理Spring Boot应用里面的所有依赖版本
Spring Boot的版本仲裁中心
1 2 3 4 5 6 7 8 <properties > <activemq.version > 5.14.5</activemq.version > <antlr2.version > 2.7.7</antlr2.version > ... <maven-war-plugin.version > 2.6</maven-war-plugin.version > <versions-maven-plugin.version > 2.2</versions-maven-plugin.version > </properties >
以后我们导入依赖默认是不需要写版本(没有在dependencies里面管理的依赖自然需要声明版本号)
4.2 导入的依赖 1 2 3 4 <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-web</artifactId > </dependency >
spring-boot-starter -web
spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件
更多启动器
Spring Boot将所有的功能场景都抽取出来,做成一个个的starter(启动器),只需要在项目里引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器
4.3 主程序类,主入口类
Spring Boot应用标注在某个类上说明这个类是Spring Boot的主配置类,Spring Boot就应该运行这个类的main方法来启动Spring Boot应用
点击这个注解(annotation)查看源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 @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 {}; }
解析
1 @SpringBootConfiguration
Spring Boot的配置类,标注在某个类上,表示这是一个Spring Boot的配置类
点击这个注解(annotation)查看源码
1 2 3 4 5 6 @Target ({ElementType.TYPE})@Retention (RetentionPolicy.RUNTIME)@Documented @Configuration public @interface SpringBootConfiguration {}
解析
配置类上来标注这个注解
配置类—-配置文件:配置类也是容器中的一个组件:@Commponent
1 @EnableAutoConfiguration
开启自动配置功能
以前我们需要配置的东西,Spring Boot帮我们自动配置,这个注解告诉Spring Boot开启自动配置功能,这样自动配置才能生效
点击这个注解(annotation)查看源码
1 2 3 4 5 6 7 8 9 10 11 12 13 @Target ({ElementType.TYPE})@Retention (RetentionPolicy.RUNTIME)@Documented @Inherited @AutoConfigurationPackage @Import ({EnableAutoConfigurationImportSelector.class }) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration" ; Class<?>[] exclude() default {}; String[] excludeName() default {}; }
解析
1 @AutoConfigurationPackage
自动配置包
点击这个注解(annotation)查看源码
1 2 3 4 5 6 7 @Target ({ElementType.TYPE})@Retention (RetentionPolicy.RUNTIME)@Documented @Inherited @Import ({Registrar.class }) public @interface AutoConfigurationPackage {}
解析
1 @Import ({Registrar.class })
Spring的底层注解@import
,给容器中导入一个组件
导入的组件由Registrar.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 static class Registrar implements ImportBeanDefinitionRegistrar , DeterminableImports { ... public void registerBeanDefinitions (AnnotationMetadata metadata, BeanDefinitionRegistry registry) { AutoConfigurationPackages.register( registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName() ); } ... }
将主配置类(@SpringBootApplication
标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器
1 @Import ({EnableAutoConfigurationImportSelector.class })
给容器中导入组件,这是导入那些组件的选择器
点击这个注解(annotation)查看源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Deprecated public class EnableAutoConfigurationImportSelector extends AutoConfigurationImportSelector { public EnableAutoConfigurationImportSelector () { } protected boolean isEnabled (AnnotationMetadata metadata) { return this .getClass().equals( EnableAutoConfigurationImportSelector.class ) ? (Boolean )this .getEnvironment ().getProperty ( "spring.boot.enableautoconfiguration", Boolean.class , true) : true; } }
然后再查看其父类的源码
里面有一个selectImports
方法,将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中
会给容器中导入非常多的自动配置类(xxxAutoConfiguration):就是给容器中这个场景所需要的所有组件,并配置好这些组件
有了自动配置类,免去了我们手动编写配置注入功能组件等的工作
selectImports
会调用该类里的getCandidateConfigurations
方法
getCandidateConfigurations
又调用了SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, classLoader)
Spring Boot在启动的时候从类路径下的META-INF/spring.factories
中获取EnableAutoConfiguration
指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作
以前我们需要自己配置的东西,自动配置类帮我们
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar
5、使用Spring Initializer快速创建Spring Boot项目 IDE都支持使用Spring的项目创建向导快速创建一个Spring Boot项目;
选择我们需要的模块,向导会联网创建Spring Boot项目;
默认生成的Spring Boot项目:
主程序已经生成好了,我们只需要添加自己的逻辑即可
resources文件夹中的目录结构
static:保存所有的静态资源:js, css, images
templates:保存所以的模板页面:(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面),可以使用官方推荐模板引擎(Freemarker, Thymeleaf)
application.properties:Spring Boot应用的配置文件,虽然Spring Boot有默认配置,但我们可以修改一些默认配置