spring的缺点:
1.spring 的组件代码是轻量级的但是他的配置却是重量级的。
2.项目的依赖管理耗时耗力(特别是版本的兼容性问题)。
springboot的特点:
1.基于spring开发提供了更快的入门体验
2.开箱即用,没有代码生成,也没有xml的配置,可以通过修改默认值的方式满足特定的需求。
3.提供了大型项目中常见的非功能特性,如:嵌入式服务器,安全,指标,健康检测,外部配置等。
4.springboot不是对spring功能上的增强,二是提供一种快速使用spring的方式。
SpringBoot的核心功能
---- 起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
---- 自动配置
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。
注意:起步依赖和自动配置的原理剖析会在第三章《SpringBoot原理分析》进行详细讲解
springBoot的使用:
1.使用idea工具创建一个maven工程,该工程为普通的java工程即可
2.添加SpringBoot的起步依赖
2.1 SpringBoot要求,项目要继承SpringBoot的起步依赖spring-boot-starter-parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
2.2 SpringBoot要集成SpringMVC进行Controller的开发,所以项目要导入web的启动依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3.编写SpringBoot引导类
3.1 要通过SpringBoot提供的引导类起步SpringBoot才可以进行访问
package com.itheima;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//声明该类是一个springboot的引导类,也就是一个入口
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class);
}
}
4.编写Controller
4.1 在引导类MySpringBootApplication同级包或者子级包中创建QuickStartController
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class QuickStartController {
//设置一个虚拟的访问地址
@RequestMapping("/quick")
//使其返回一个字符串
@ResponseBody
public String quick(){
return "springboot 访问成功!";
}
}
5.执行SpringBoot起步类的主方法
tomcat已经起步,端口监听8080,web应用的虚拟工程名称为空
打开浏览器访问url地址为:http://localhost:8080/quick
- @SpringBootApplication:标注SpringBoot的启动类,
- SpringApplication.run(MySpringBootApplication.class) 代表运行SpringBoot的启动类,参数为SpringBoot启动类的字节码对象
SpringBoot工程热部署
6.我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,
浪费了大量的时间,我们可以在修改代码后不重启就能生效,
在 pom.xml 中添加如下配置就可以实现这样的功能,我们称之为热部署。
<!--热部署配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
IDEA进行SpringBoot热部署失败原因
出现这种情况,并不是热部署配置问题,其根本原因是因为Intellij IEDA默认情况下不会自动编译,需要对IDEA进
行自动编译的设置。
file–settings–compiler–build project automatically
然后 Shift+Ctrl+Alt+/,选择Registry–complier.automake.allow.when.app.running–close
7.使用idea快速创建SpringBoot项目(注意文件夹的属性java,resources。。。)
file–new–module–spring initializr(选好jdk)–在project metadata中修改group+artifact+java version+package–web(勾选web)
8.配置文件的优先级
*.propertise > .yaml >.yml
优先级高的会把优先级低的覆盖
yml文件的用法(只要是键值之间都有空格)
普通数据的配置:
属性:空格属性值
对象的配置(缩进关系表示层级关系)
person:
name: zhangsan
age: 18
address: beijing
server:
port: 8082
配置行内对象(对象与属性之间有空格)
person: {name: zhangsan, age: 18, address: beijing}
配置数组,集合(字符串)
(1)普通方式
city:
- jinan
- henan
- yunnan
- hainan
(2)行内方式
city: [jinan,henan,yunnan,hainan]
配置数组,集合(对象)(每一个 - 代表一级)
(1)普通方式
student:
- name: mingren
age: 18
addr: dfd
- name: ningci
age: 21
addr: Japan
(2)行内方式
student: [{name: zhangsan, age: 18, address: jinan},{name: lisi,age: 20,address: yunnan}]
配置Map集合
map:
key1: value1
key2: value2
key3: value3
获取yml中的值
1.使用@value注解注入的方式获取值(controller)
@Value("${count}")
private String count;
@Value("${person.address}")
private String address;
2.在类上@ConfigurationProperties(prefix = “person”)注解,系统会自动的从容器中获取对应的值
“person”是容器中的前缀
实体bean代码(必须添加get set方法)
@Controller
@ConfigurationProperties(prefix = "person")
public class testController2 {
private String name;
private String age ;
private String address;
springBoot整合mybatis
(1)添加mybatis的起步依赖(mybatis提供的起步依赖)
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
(2)添加数据库驱动坐标
<!-- MySQL连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
(3)添加数据库连接信息
<!-- 在application.properties中添加数据量的连接信息 -->
#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?
useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
(4)在test数据库中创建user表
(6)创建实体Bean(提供getset方法)
(7)编写Mapper
(8)配置Mapper映射文件
在src\main\resources\mapper路径下加入UserMapper.xml配置文件"
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="queryUserList" resultType="user">
select * from user
</select>
</mapper>
(9)在application.properties中添加mybatis的信息
#spring集成Mybatis环境
#pojo别名扫描包
mybatis.type-aliases-package=com.itheima.domain
#加载Mybatis映射文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
(10)编写测试Controller
@Controller
public class MapperController {
@Autowired
private UserMapper userMapper;//发现报错,是因为容器中没有UserMapper,你需要在dao层加一个方法上的@Mapper注解,加了之后还报错不用管,不影响
@RequestMapping("/queryUser")
@ResponseBody
public List<User> queryUser(){
List<User> users = userMapper.queryUserList();
return users;
}
(11)测试
springBoot整合Junit
(1)导入测试的起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
(2)写测试类
SpringBoot整合Spring Data JPA
(1)添加Spring Data JPA的起步依赖
<!-- springBoot JPA的起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
(2)添加数据库驱动依赖
<!-- MySQL连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
(3)在application.properties中配置数据库和jpa的相关属性
#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?
useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
#JPA Configuration:
spring.jpa.database=MySQL
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
(4)创建实体配置实体
@Entity
public class User {
// 主键
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 用户名
private String username;
// 密码
private String password;
// 姓名
private String name;
//此处省略setter和getter方法... ...
}
(5)编写UserRepository
public interface UserRepository extends JpaRepository<User,Long> {
public List<User> findAll();
}
(6)编写测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes=MySpringBootApplication.class)
public class JpaTest {
@Autowired
private UserRepository userRepository;
@Test
public void test(){
List<User> users = userRepository.findAll();
System.out.println(users);
}
}
如果使用的是jdk9,jdk缺少相应的jar
解决方案:手动导入对应的maven坐标
<!--jdk9需要导入如下坐标-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
springboot整合Redis
(1)添加redis的起步依赖
<!-- 配置使用redis启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(2)配置redis的连接信息
#Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
(3)注入RedisTemplate测试redis操作
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MySpringBootApplication.class)
public class RedisTest {
@Autowired
private RedisTemplate<String,String> redisTemplate;
//<bean class="RedisTemplate">
@Autowired
private UserRepository userRepository;
@Test
public void test() throws JsonProcessingException {
//1、从redis中获得数据 数据的形式json字符串
String userListJson = redisTemplate.boundValueOps("user.findAll").get();
//2、判断redis中是否存在数据
if(null==userListJson){
//3、不存在数据 从数据库查询
List<User> all = userRepository.findAll();
//4、将查询出的数据存储到redis缓存中
//向将list集合转换成json格式的字符串 使用jackson进行转换
ObjectMapper objectMapper = new ObjectMapper();
userListJson = objectMapper.writeValueAsString(all);
redisTemplate.boundValueOps("user.findAll").set(userListJson);
System.out.println("=======从数据库中获得user的数据======");
}else{
System.out.println("=======从redis缓存中获得user的数据======");
}
//4、将数据在控制台打印
System.out.println(userListJson);
}
springboot的两个重要的注解
@RunWith(SpringRunner.class)
//引导类的字节码对象
@SpringBootTest(classes = MySpringBootApplication.class)