SpringBoot简介
简化Spring使用难度,简省配置,快速高效使用Spring框架开发应用
核心功能
- SpringBoot项目不需要模板化的配置。
- SpringBoot中整合第三方框架时,只需要导入相应的starter依赖包,就自动整合了。
- SpringBoot默认只有一个.properties的配置文件,不推荐使用xml,后期会采用.java的文件去编写配置信息。
- SpringBoot工程在部署时,采用的是jar包的方式,内部自动依赖Tomcat容器,提供了多环境的配置。
SpringBoot简介
SpringBoot的目录结构
pom.xml文件
- 指定了一个父工程: 指定当前工程为SpringBoot,帮助我们声明了starter依赖的版本。
- 项目的元数据:包名,项目名,版本号。
- 指定了properties信息:指定了java的版本为1.8
- 导入依赖:默认情况导入spring-boot-starter,spring-boot-starter-test
- 插件:spring-boot-maven-plugin
src目录
-src
-main
-java
-包名
启动类.java # 需要将controller类,放在启动类的子包中或者同级包下
-resources
-static # 存放静态资源的
-templates # 存储模板页面的
application.properties # SpringBoot提供的唯一的配置文件
-test # 只是为了测试用的
SpringBoot三种启动方式
- 运行启动类的main方法
- maven命令
mvn spring-boot:run - 采用jar包的方式运行
将当前项目打包成一个jar文件,并通过java -jar jar文件
SpringBoot原理分析
starters的原理
-
starters是依赖关系的整理和封装。一套依赖坐标的整合,可以让导入应用开发的依赖坐标更方便。
-
有了这些Starters,你获得Spring和其整合的所有技术的一站式服务。无需配置、无需复制粘贴依赖坐标,一个坐标即可完成所有入门级别操作。
-
举例:JPA or Web开发,只需要导入
spring-boot-starter-data-jpa
或spring-boot-starter-web
。
-
每个Starter包含了当前功能下的许多必备依赖坐标,这些依赖坐标是项目开发,上线和运行必须的。同时这些依赖也支持依赖传递。举例:
spring-boot-starter-web
包含了所有web开发必须的依赖坐标
-
starter的命名规范:官方的starter写法
spring-boot-starter-*
,非官方的starter写法thirdpartyproject-spring-boot-starter
自动配置的原理
每个Starter基本都会有个AutoConfiguration的Jar包,每个AutoConfiguration定义了约定的默认配置。
有了自动配置,那么我们配置基本就全部采用默认配置。当然需要配置时,也可以更改。
如何查看自动配置的值在哪里?
追踪步骤:
- @EnableAutoConfiguration
- @Import({AutoConfigurationImportSelector.class})
- spring.factories
- ServletWebServerFactoryAutoConfiguration
- @EnableConfigurationProperties({ServerProperties.class})
SpringBoot常用配置
SpringBoot的配置文件格式
SpringBoot的配置文件支持properties和yml,甚至他还支持json。
更推荐使用yml文件格式:
-
yml文件,会根据换行和缩进帮助咱们管理配置文件所在位置
-
yml文件,相比properties更轻量级一些yml文件的劣势:
1. 严格遵循换行和缩进
2. 在填写value时,一定要在: 后面跟上空格
多环境配置
在application.yml文件中添加:
spring:
profiles:
active: 环境名
在resource目录下,创建多个application-环境名.yml文件即可
在部署工程时,通过 java -jar jar文件 --spring.profiles.active=环境
配置属性如何传入注入Bean
1、使用注解@Value映射
- @value注解将配置文件的值映射到Spring管理的Bean属性值
- 可以注入对象,不能注入Map、数组、集合的类型数据。
- 不需要提供Setter方法
2、使用注解@ConfigurationProperties映射
- 通过注解@ConfigurationProperties(prefix=’'配置文件中的key的前缀")可以将配置文件中的配置自动与实体进行映射。
- 可以注入对象、Map、数组、集合的类型数据。
- 使用@ConfigurationProperties方式必须提供Setter方法。
SpringBoot集成一切
集成MyBatis
- 勾选依赖坐标
- Spring Web Starter
- MySQL Driver
- MyBatis Framework
- 在application.yml中添加数据库连接信息
spring:
# 数据源配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://127.0.0.1/数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
# mybatis配置
mybatis:
# 扫描接口对应的XML映射文件
mapper-locations: classpath:mapper/*.xml
# 起别名
type-aliases-package: top.zhenghy123.pojo
- 编写Dao接口:使用@Mapper标记该类是一个Dao接口,可以被SpringBoot自动扫描(或者在启动类上面加@MapperScan(basePackages = “top.zhenghy123.dao”) //dao接口包的位置一样的效果)
- 配置Mapper映射文件:在src/main/resources/mapper路径下加入UserMapper.xml配置文件
集成Spring Data Redis
- 添加Redis起步依赖
<!--spring data redis 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 在yml中配置Redis连接信息(可以不配使用默认值)
# Redis 配置(不填也是可以的)
spring.redis.host=localhost
spring.redis.port=6379
- 注入RedisTemplate测试Redis操作
@Autowired
private RedisTemplate redisTemplate;
集成定时器
- 在启动类上加@EnableScheduling注解开启定时器
- 配置定时器方法(随便在哪个组件中添加该方法都可以)
@Component
public class TimerUtil {
@Scheduled(cron = "cron表达式")
public void mytask(){
System.out.println(LocalDateTime.now());
}
}
发送HTTP请求
服务调用方式:RPC和HTTP
常见远程调用方式:
-
RPC:(Remote Produce Call)远程过程调用
基于Socket、自定义数据格式、速度快,效率高。
典型应用代表:Dubbo,WebService,ElasticSearch集群间互相调用。 -
HTTP:网络传输协议
基于TCP/IP、规定数据传输格式、缺点是消息封装比较臃肿、传输速度比较慢。
优点是对服务提供和调用方式没有任何技术限定,自由灵活,更符合微服务理念。 -
RPC和HTTP的区别:RPC是根据语言API来定义,而不是根据基于网络的应用来定义。
Spring的RestTemplate
- RestTemplate是Rest的HTTP客户端模板工具类
- 对基于Http的客户端进行封装
- 实现对象与JSON的序列化与反序列化
- 不限定客户端类型,目前常用的3种客户端都支持:HttpClient、OKHttp、JDK原生
URLConnection(默认方式)
RestTemplate案例
- 创建一个springboot的工程,勾选Web的Starter
- 在项目启动类位置中注册一个RestTemplate对象
@Configuration
public class MyConfiguration {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 在测试类ApplicationTests中 @Autowired 注入RestTemplate
- 通过RestTemplate的getForObject()方法,传递url地址及实体类的字节码
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private RestTemplate restTemplate;
@Test
public void testREST() {
String url = "http://baidu.com";
String json = restTemplate.getForObject(url, String.class);
System.out.println(json);
}
}
- RestTemplate会自动发起请求,接收响应
- 并且帮我们对响应结果进行反序列化
- 运行测试类中的testREST方法
SpringBoot如何代码测试
SpringBoot集成JUnit测试功能,进行查询用户接口测试。
- 添加Junit起步依赖(默认就有)
<!--spring boot测试依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 编写测试类:
- SpringRunner继承SpringJUnit4ClassRunner,使用哪一个Spring提供的测试引擎都可以。
指定运行测试的引擎 - @SpringBootTest的属性值指的是引导类的字节码对象
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void test() {
List<User> users = userMapper.queryUserList();
System.out.println(users);
}
}