赞
踩
SpringBoot是一个开发基于Spring框架的应用的快速开发框架,它也是SpringCloud构建微服务分布式系统的基础设施。
SpringBoot的主要特色包括构建独立的Spring应用、嵌入式的Web容器、固化的starter依赖、自动装配Spring模块或第三方库、产品就绪特性(日志、指标、健康检查、外部化配置等)、避免或简化XML配置等特性。
相对于普通的Spring应用,使用SpringBoot构建的Spring应用可以直接打包为一个独立可执行的jar或war包,使用java -jar命令即可运行,不需要管理依赖的第三方库,也不需要依赖外部容器来启动应用。之前使用Spring开发的Java Web应用,一般都会在第三方的Web容器中启动,比如Tomcat等,而使用SpringBoot开发的Java Web应用,虽然基于Spring,但它提供了内嵌的Web容器(基于Servlet或Reactive的Web容器,如Tomcat、Jetty、Undertow、NettyWebServer),通过SpringBoot插件,把所有依赖的第三方库、Web容器和应用本身一起重新打包(repackage)为一个Fat Jar或Fat War,然后直接使用java -jar命令运行即可。
SpringBoot内置了多种嵌入式Web容器,包括Tomcat、Jetty、Undertow、NettyWebServer等,用于运行基于Servlet或Reactive的Web应用,无需再打包部署WAR文件,即不需要依赖外部的Web容器部署。
SpringBoot提供了一系列的starter依赖,用于快速的引入应用依赖的Spring模块及相关的第三方库。不同版本的SpringBoot,与其依赖的Spring模块及其相关的第三方库的版本关系是固定的,一一对应的。开发人员不需要关注依赖的Spring模块和第三方库的版本,只需要关心SpringBoot的版本即可,SpringBoot会正确引入依赖的Spring模块和第三方库的版本。固化依赖,可以降低SpringBoot应用管理依赖的成本。
SpringBoot启动应用时,会推断应用类型,并检测引入的Spring模块或第三方库,当条件满足时自动加载Spring模块或第三方库的组件到容器中,以提供给应用使用。
SpringBoot提供了应用部署产品环境运行所必须的日志、指标、健康检查、外部化配置等特性,为部署后的运维提供工具支持,支撑应用尽可能快的部署到产品环境。
不会额外生成代码,并且可以简化甚至不需要xml或properties文件配置,即可快速开发Spring应用。
以前说到Spring,一般指Spring框架(SpringFramework),它是一个开源、轻量级的Java应用开发框架。其核心是控制反转IOC和面向切面编程AOP。Spring提供了很多包括ORM、事务管理、WebMVC等非常有用的模块构建Java应用。
SpringBoot则是在Spring基础之上,用于快速构建Spring应用的一个框架,它并不是要取代Spring,而是基于Spring的。
SpringCloud是一个分布式微服务系统的开发框架,SpringBoot则是SpringCloud的基础设施。三者之间都不是取代的关系,而是一种倒三角的依赖关系,顶层是SpringCloud,中间层是SpringBoot,底层是Spring。
springboot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是在Springboot自动完成的。
起步依赖的本质是Maven项目对象模型(POM),定义了对其他库的传递依赖,这些东西加在一起支持某项功能。
简单的说,起步依赖就是将具备某种功能的坐标打包在一起,并提供一些默认的功能。
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器,安全,指标,健康检查,外部配置等
总结:Springboot并不是对spring功能上的增强,而是提供了一种快速使用spring的方式。Springboot是对Spring的优化。
- @SpringBootApplication
- @ServletComponentScan
- @EnableFeignClients
- @ComponentScan({"com.xxx.xxx.web", "com.xxx.xxx.log", "com.xxx.xxx.activiti", "com.xxx.xxx.autoconfigure"})
- public class Application {
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
- }
使用Springboot和Spring构建的项目,业务代码编写方式完全一样
1、起步依赖原理分析
(1) spring-boot-starter-parent
在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本
在各种starter中,定义了完成该功能需要的坐标集合,其中大部分版本信息来自于父工程
我们的工程继承了parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突问题
(2) spring-boot-starter-web
properties(高优先级):键值对
server.port = 8080
yml(低优先级):缩进
server:
port: 8080
小结
springboot提供了两种配置文件类型:properties和yml
默认配置文件名称:application
在同一级目录下优先级为:properties > yml > yaml
1)@Value
- @Value("${name}")
- private String name;
注入单个值的属性是比较合适的
2)Environment
- @Autowired
- private Environment env;
- String name = env.getProperty("name")
3)@ConfigurationProperties
配合@Component使用,直接加载类上面即可;
开发SpringBoot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址,服务器端口等等配置都不同,如果每次打包时都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
(1)profile配置方式
多profile文件方式
yml多文档方式
(2)profile激活方式
配置文件:在application.propertie中配置: spring.profile.active=dev
虚拟机参数:在VM options指定:-Dspring.profiles.active=dev
命令行参数:java -jar xxx.jar --spring.profile.active=dev
(1)搭建springboot工程
(2)引入starter-test起步依赖
(3)编写测试类
(4)添加测试相关注解
@RunWith(SpringRunner.class)
@SpringBootTest(classes=启动类.class)
(5)编写测试方法
(1)搭建springboot工程
(2)引入redis起步依赖
spring-boot-starter-data-redis
(3)配置redis相关属性
(4)注入RedisTemplate模板
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class application { @Autowired private RedisTemplate redisTemplate; @Test public void set(){ redisTemplate.boundValueOps("name").set("zhangsan"); } @Test public void get(){ Object name = redisTemplate.boundValueOps("name").get(); System.out.println(name); } }(5)编写测试方法
(1)搭建springboot工程
(2)引入mybatis起步依赖,添加MySQL驱动
mybatis-spring-boot-starter
mysql-connecor-java
(3)编写DataSource和Mybatis相关配置
(4)定义表和实体类
(5)编写dao和Mapper文件/纯注解开发
(6)测试
七、SpringBoot的启动流程
1、启动SpringBoot启动类SpringbootdemoApplication中的main方法。
2、调用SpringApplication.run(SpringbootdemoApplication.class, args),且构建了一个SpringApplication对象,应用程序将从指定的主要来源加载Bean。
3、运行 Spring 应用程序,创建并刷新一个新的 ApplicationContext。
1、pom.xml
spring-boot-dependencies:核心依赖在父工程中
我们在写或者引入一些springboot依赖的时候,不需要指定版本,就因为有这些版本仓库
2、启动器
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactId>spring-boot-starter</artifactId>
</dependency>
启动器:即springboot的启动场景
比如spring-boot-starter-web,它就会帮我们自动导入web环境所有依赖
springboot会将所有的功能场景变成一个个启动场景
我们要使用什么功能,就只需要找到对应的启动器即可
3、主程序
@SpringBootApplication
标志这个类是一个springboot的应用
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
@RestController
@RestController 是@Controller和@ResponseBody 的结合
@Controller 将当前修饰的类注入SpringBoot IOC容器,使得该类所在的项目跑起来的过程中,这个类就被实例化。
@ResponseBody 的作用是指该类中所有的API接口返回的数据,对应的方法返回Map或是其他Object,都会以Json字符串的形式返回给客户端
@RequestMapping
@RequestMapping注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上,处理get和post的请求
@GetMapping处理get请求
@PostMapping处理post请求
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到
· SpringBoot造创建项目时,使用jar的打包方式
· SpringBoot的引导类,启动类,是项目的入口,运行main方法就可以启动项目
· 使用SpringBoot和Spring构建的项目,业务代码编写方式完全一样
· 在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本,可以不用自己指定导入依赖的版本
· 在各种starter中,定义了完成该功能的需要的坐标(gav)合集,其中大部分版本信息来自于父工程
· 我们的工程继承spring-boot-starter-parent,引入starter之后,通过依赖传递,可以简单方便获得需要的jar包,并且不会存在版本冲突等问题
SpringBoot是基于约定的,所以很多配置都有默认值,如Tomcat端口是8080;但是如果想使用自己的配置替换默认配置的话,就可以使用application.properties或application.yaml进行配置;配置文件中包括两种内容,一种是程序能够自动识别的内容,一种是我们自己配置的内容,需要用注解或是其他
·properties
server.port=8080
·yml
server:
port: 8080
·xml
<server>
<port>8080</port>
<address>127.0.0.1</address>
</server>
YAML是一种直观的能够被电脑识别的数据序列化格式,并且能够被人阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入;YAML文件是以数据为核心的,比传统的xml方式更加简介,其扩展名为.yaml或.yml; 简洁,以数据为中心;
·大小写敏感
·数据值前面必须有空格,作为分隔符
·使用缩进表示层级关系
·缩进时不允许使用Tab,只允许使用空格(因为各个系统中Tab对应的空格数可能不同,最后导致层次混乱)
·缩进的空格数目不重要,只要相同层级的元素左对齐即可
·#表示注释,从这个字符一直到行尾,都会被解析器忽略
YAML数据格式
·对象(map):键值对的集合
person:
name:zhangsan
person: {name: zhangsan}
·数组:一组依次排列的值
address:
-beijing
-shanghai
address: [beijing,shanghai]
·纯量:单个的,不可再分的值
msg: 'hello \n world' #单引号忽略转义字符
msg1: "hello \n world" #双引号识别转义字符
YAML参数引用
name: lisi
person:
name: ${name} #引用上边定义的name值
读取配置内容
(1)@Value
@Value("${name}")
private String name;
(2)Environment
@Autowired
private Environment env;
env.getProperty("name")
(3)@ConfigurationProperties
profiles
在开发springboot的应用时,通常同一程序会被安装到不同环境,比如:开发、测试、生产等;其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都需要修改配置文件,那么非常麻烦。profile功能就是用来进行动态配置切换的。
profile激活方式:配置文件、虚拟机参数、命令行参数
配置文件:在配置文件application.properties中配置:spring.profiles.active=pro
表示需要激活的配置文件是application-pro.properties,即程序里面需要使用的配置都从application-pro.properties里面取
虚拟机参数:在工程的VM options指定:-Dspring.profiles.active=pro
命令行参数:将工程打包放到服务器上面,或者是在终端进行运行
java -jar 包名.jar --spring.profiles.active=pro
整合Junit进行单元测试
整合redis
Redis 是一个高性能的key-value数据库
整合MyBatis
实现步骤
①搭建springboot工程
②引入mybatis起步依赖,添加MySQL驱动
③编写DataSource和mybatis相关配置
④定义表和实体类
⑤编写dao和mapper文件/纯注解开发
⑥测试
SpringBoot原理分析
·SpringBoot自动配置
Condition
Condition是在spring4.0增加的条件判断功能,通过这个可以实现选择性的创建Bean操作
·自定义条件:
① 定义条件类:自定义类实现Condition接口,重写matches方法,在matches方法中进行逻辑判断,返回boolean值,matches方法有两个参数
--context:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory
--metadata:元数据对象,用于获取注解属性
② 判断条件:在初始化Bean时,使用@Conditional(条件类.class)注解
·SpringBoot提供的常用条件注解:
(1)ConditionalOnProperty
(2)ConditionalOnClass
(3)ConditionalOnMissingBeans
Enable注解原理
SpringBoot中提供了很多Enable开头的注解,这些注解都是用于动态开启某些功能的。而其底层原理是使用@Import注解导入一些配置类,实现Bean的动态加载。
@Import注解后面的类都会被spring创建并放入IOC容器;
@Import的用法:(1)导入Bean(2)导入配置类(3)导入ImportSelecter实现类,一般用于加载配置文件中的类(4)导入ImportBeanDefinitionRegestrar实现类
@EnableAutoConfiguration注解
@EnableAutoConfiguration内部使用@Import(AutoConfig)
SpringBoot监控
SpringBoot项目部署
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。