SpringBoot是什么
SpringBoot是Spring家庭中的微型框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
官方地址:https://projects.spring.io/spring-boot/
参考文档:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/
SpringBoot要解决的问题
随着Java语言的慢慢发展,Java的开发显得格外的笨重,繁多的配置,低下的开发效率,复杂的部署流程以及第三方技术集成难度非常大而且杂。
在上述环境中,SpringBoot营运而生,它使用“习惯由于配置”的理念让你的项目快速的运行起来,使用SpringBoot很容易创建一个独立运行。它内置Tomcat,Servlet,Spring等等基本开发的功能。
SpringBoot的优势
主要优势:
- 快速构建项目。
- 项目可独立运行,无须外部依赖Servlet容器。
- 对主流框架无配置支持,简化开发,也可以修改默认值。
- 提供运行时的应用监控。
- 极大的提高了开发、部署效率。 与spring cloud天然集成
限制:将现有或传统的Spring Framework项目转换为Spring Boot应用程序是一个非常困难和耗时的过程。它仅适用于全新Spring项目
微服务
什么是微服务?
2014年,由martin fowler这个人在自己的博客中提出的。 它是一种“软件的架构风格”,一个应用应该是一组小型服务。各个小型服务运行在各自的环境中,通过http的方式进行互通。
单体应用
传统的应用架构,ALL IN ONE模式。
微服务和传统应用的对比
SpringBoot的环境准备
环境准备
- Jdk8.0以上。
- Maven3.x以上,需要设置jdk8的运行环境。
- 开发工具:sts、idea。
- SpringBoot。
使用IntelliJ IDEA创建SpringBoot项目。
SpringBoot是基于Maven工程来创建的。
这种生成方式需要联网下载对应的模板内容。会帮助我们来生成SpringBoot的基本框架。
根据模板创建好SpringBoot项目后,默认在resources模板下面会生成一下几个目录和文件。
static:主要用来保存所有的静态资源,包括js,css,image等。
templates:保存所有的模板页面。SpringBoot默认以jar包的方式来部署项目,所以默认是不支持jsp页面的,但是可以使用模板引擎(freemarker,thymeleaf)。
application.properties:Spring Boot默认的配置文件。默认情况下SpringBoot是不需要配置文件的,但是可以通过这个类修改默认值。比如修改端口号。
修改默认的端口号:
在application.properties中可以修改springboot的配置信息。
修改默认的端口号 server.prot=8081
使用 Eclipse(STS) 创建SpringBoot项目。
在STS中也集成了对SpringBoot模板的支持。我们可以通过STS来创建SpringBoot项目。
设置SpringBoot的parent
在SpringBoot中,必须继承spring-boot-starter-parent这个包,这个是SpringBoot的默认配置信息,极大的提高了我们的开发效率。
<!-- 该父项目中包含了所依赖包的版本号信息。以后我们导入jar包时,就可以不需要指定版本号了。-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 该包中导入了SpringBoot的Web运行环境所依赖的jar包。-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
实现一个 ''Hello World''
@Controller
public class HelloControllor {
@ResponseBody
@RequestMapping("home")
public String home(){
return "Hello World!";
}
}
直接使用SpringBoot插件运行。
启动浏览器,输入localhost:8080即可看到页面。
运行部署的项目
直接将项目打包成.jar文件之后。就可以通过java –jar springboot_xxx.jar命令运行项目。不需要另外安装tomcat等其他工具,极大的简化了部署流程。(这里就不做多演示了)
SpringBoot启动器
在SpringBoot中,有一个非常重要的概念,就叫“场景启动器”,它帮助我们导入对应模块正常运行所依赖的组件。
SpringBoot将所有的功能场景都抽取出来,做成一个个的Starters(启动器),只需要在项目中引入这些starter相关场景的所依赖的环境都会导入进来。要什么功能就导入什么样的启动器。
SpringBoot和Maven集成
在SpringBoot中,我们只需要使用@SpringBottApplication注解修饰入口方法类,然后运行main方法就可以启动Springboot,非常方便。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication
SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用。
该注解其实是一个组合注解,其中包含了一些其它的注解。
@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 {
@SpringBootConfiguration
该注解是SpringBoot的配置类,标注在某个类上,表示该类是SpringBoot的一个配置类。
这个注解也包含几个其它的注解。
- @Configuration:配置类上来标注这个注解。配置类也是容器中的一个组件。
- @EnableAutoConfiguration:开启自动配置功能。以前我们需要配置的东西,现在我们都不需要配置了,SpringBoot帮我们自动配置了。
@EnableAutoConfiguration
在@ EnableAutoConfiguration注解中又包含了两个比较重要
- @AutoConfigurationPackage:自动配置包,通过@Import(AutoConfigurationPackages.Registrar.class)类来指定对应的包。默认是将@SpringBootApplication所在的包以及该包下的所有子包导入到容器中。
- @Import(AutoConfigurationImportSelector.class):导入哪些组件的选择器。将所有需要导入的组件以全类名的方式返回,这些组件将会返回给一个List<String> configurations集合中,这些类是各种组件的自动配置文件,然后被添加到容器中。
SpringBoot自动配置
SpringBoot中最核心的功能就是自动配置类,在SpringBoot中会加载大量的自动配置类。
我们可以查看我们需要的功能有没有SpringBoot默认写好的自动配置类。如果有就不需要配置了,如果没有,可以根据对应的XxxProperties类查看相关的属性。然后再配置文件对修改对应的属性值即可
XxxxAutoConfiguration:自动配置类。
XxxxProperties:封装配置文件中的相关属性。
XxxxAutoConfiguration:
我们通过SpringBoot会加载大量的AutoConfiguration配置类,其中对应相关组件的配置信息。 该类是通过全注解方式来配置相关的属性。
在这个配置类中,我们也可以看到一些@Conditional开头和以Properties结尾的类。
- 以@Conditional开头的表示的是条件类。
- 以Properties结尾的表示的是对应的属性类。
Conditional扩展
在SpringBoot自动配置类中存在大量的@Conditional开头的注解,这些注解的作用是当满足某些条件时,该注解才会生效。
@Conditional扩展注解 | 作用(判断是否满足当前指定条件) |
@ConditionalOnJava | 系统的java版本是否符合要求 |
@ConditionalOnBean | 容器中存在指定Bean; |
@ConditionalOnMissingBean | 容器中不存在指定Bean; |
@ConditionalOnExpression | 满足SpEL表达式指定 |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissingClass | 系统中没有指定的类 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的Bean,或者这个Bean是首选Bean |
@ConditionalOnProperty | 系统中指定的属性是否有指定的值 |
@ConditionalOnResource | 类路径下是否存在指定资源文件 |
@ConditionalOnWebApplication | 当前是web环境 |
@ConditionalOnNotWebApplication | 当前不是web环境 |
@ConditionalOnJndi | JNDI存在指定项 |
虽然默认情况下加载了非常多的自动配置类文件,但是由于Conditional的限制,并不会加载所有的配置类。可以通过debug=true打开springboot的日志信息来查看加载了哪些自动配置类。