1.1 Spring Boot理解
Spring Boot来简化Spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用
背景
J2EE笨重的开发、繁多的配置、低下的开发效率、 复杂的部署流程、第三方技术集成难度大。
解决
“Spring全家桶”时代。
pring Boot => J2EE一站式解决方案
Spring Cloud => 分布式整体解决方案
优点
快速创建独立运行的Spring项目以及与主流框架集成
使用嵌入式的Servlet容器,应用无需打成WAR包
starters自动依赖与版本控制
大量的自动配置,简化开发,也可修改默认值
无需配置XML,无代码生成,开箱即用
准生产环境的运行时应用监控 – 与云计算的天然集成
单体应用:ALL IN ONE
微服务:martin fowler,一种架构风格(服务微化)
一个应用应该是一组小型服务;可以通过HTTP的方式进行互通
微服务:每一个功能元素终都是一个可独立替换和独立升级的软件单元
1.2 统一开发环境
Maven配置-settings.xml中添加
<profile> <id>jdk-1.8id> <activation> <activeByDefault>trueactiveByDefault> <jdk>1.8jdk> activation> <properties> <maven.compiler.source>1.8maven.compiler.source> <maven.compiler.target>1.8maven.compiler.target> <maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion> properties>profile>
IDEA配置使用外部Maven
1.3 SpringBoot-HelloWorld
创建maven项目
导入SpringBoot相关依赖
<parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.3.2.RELEASEversion> <relativePath/> parent><dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency>dependencies>
创建主程序
/** * @SpringBootApplication:用来标注一个主程序类,说明这是一个SpringBoot应用 */@SpringBootApplicationpublic class HelloWorldMainApplication { public static void main(String[] args) { //Spring应用启动 SpringApplication.run(HelloWorldMainApplication.class,args); }}
编写相关的Controller,Service
@Controllerpublic class HelloController { @ResponseBody @RequestMapping("/hello") public String hello(){ return "Hello World!"; }}
启动主程序测试即可
简化部署
pom.xml导入maven插件
<build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> plugins>build>
-
将这个应用打成jar包
注意:打成的jar包中已经携带了嵌入式的tomcat服务器
jar包直接使用 java -jar 命令进行执行
1.4 HelloWorld细节 - 场景启动器(starter)
探究POM文件 - 父项目
spring-boot-dependencies项目即是SpringBoot的版本仲裁中心,以后我们导入依赖默认是不需要写版本的。(没有在该父项目里管理的依赖还是要声明版本号)
<parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.3.2.RELEASEversion> <relativePath/> parent><parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-dependenciesartifactId> <version>2.3.2.RELEASEversion>parent>
探究POM文件 - 导入的依赖
spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件
<dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency>dependencies>
引申结论
Spring-boot-starter:SpringBoot场景启动器
SpringBoot将所有的功能场景都抽取出来做成了一个个的starters(启动器),只需要在项目里引入这些starter,相关场景的所有依赖都会导入进来。
1.5 HelloWorld细节 - 探究主程序(主入口)类 - 自动配置
@SpringBootApplication
该注解标注在某个类上说明该类就是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动这个SpringBoot应用
@SpringBootConfiguration
SpringBoot的定义的注解,@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
@Configuration
@SpringBootConfiguration继承自@Configuration
@Configuration是Spring定义的注解,用来表示当前类是一个配置类
因@Configuration上标注有@Component,所以配置类也是容器中的一个组件
@EnableAutoConfiguration
开启自动配置功能。以前需要我们配置的东西,SpringBoot会自动帮助我们配置。
-
@AutoConfigurationPackage
自动配置包。其本身含义是将主配置类所在包及下面所有子包里面的所有组件扫描到Spring容器中
进入后发现其上标注有@Import({Registrar.class}),@Import是Spring的底层注解,用于给容器中导入一个组件即AutoConfigurationPackage.Registrar.class。该组件实现了ImportBeanDefinitionRegistrar,用于手工指定具体导入哪些组件。
-
@Import({AutoConfigurationImportSelector.class})
AutoConfigurationImportSelector的selectImports方法会将所有需要导入的组件以全类名的方式返回,这些组件就会被加载到当前SpringBoot创建并使用的IoC容器中。
这需要借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,在AutoConfigurationImportSelector类中可以看到通过 SpringFactoriesLoader.loadFactoryNames()扫描所有jar包类路径下META‐INF/spring.factories,把扫描到的这些文件的内容包装成properties对象,从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中
-
总结:
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取到EnableAutoConfiguration.class类(类名)对应的值(当前Springboot版本一共127个自动配置类),将这些值作为自动配置类导入到容器中,自动配置生效开始进行自动配置工作。
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure.jar下
1.6 使用向导快速创建SpringBoot应用
IDEA:使用 Spring Initializer快速创建项目
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应用的配置文件;可以修改一些默认设置
STS:使用 Spring Starter Project快速创建项目