一、SpringBoot简介
1. 设计初衷
为了简化项目的开发,无xml开发,采用自动化的配置让程序员使用的框架更舒服,更加的专注于业务逻辑的开发。
2. 核心功能
- 自动配置
- 内嵌式的tomcat
- 一系列的starters(jar包的集合)
- …
3. 优势
- 无xml更加便于开发
二、SpringBoot入门案例
1. 自动构建boot
目标:
1.构建springboot项目
2.编写HelloController返回hello world
步骤:
- 使用idea创建空项目
- new model—>spring init(maven上面就是)
- 填写项目基本信息
- 选择依赖,版本(boot)
- 编写HelloController返回hello world
详情:
-
填写基本信息
-
选择依赖
- 编写HelloController返回hello world
三、SpringBoot配置文件
springboot支持两种类型的配置文件,一种是properties(key=val),另一种是yaml(yml),更加容易识别,读取更加方便。
1. 修改端口号
properties
server.port=8081
yml
server:
port: 8082
注意:
如果properties和yml中同时配置了端口号,那么以properties中为准。
2. yml支持数据类型
#基本数据类型 格式 key+ : + 空格 + val
personName: 张三
#对象类型数据
person:
name: 于谦
age: 50
sex: 男
#数组
likes:
- 抽烟
- 喝酒
- 烫头
#集合
books:
- name: 葵花宝典
writer: 郑和
- name: 金瓶梅
writer: 兰陵笑笑生
3. 获取yml配置文件内容
@Value
@RestController
public class HelloController {
@Value("${personName}")
private String name;
@RequestMapping("hello")
public String hello(){
return "hello world " + name;
}
}
@ConfigurationProperties
@Component //注入spring容器
@ConfigurationProperties(prefix = "person") //可以根据前缀注入配置文件中的val
public class Person {
private String name;
private Integer age;
private String sex;
private String likes [];
private List<Booke> books;
//省略set get toString
}
4. 多环境配置文件使用
properties
需要在总配置文件中指定使用哪个配置文件
spring.profiles.active=dev
yml多环境配置文件(自习)
四、SpringBoot整合其他技术
1. boot整合mybatis
目标:
- 要求使用boot整合mybatis完成查询所有用户的功能
步骤:
- 创建spring-boot-mybatis项目
- 选择版本2.1.X版本(如果选择错误,删除重建)
- 选择依赖:web/lombok/mybatis框架/mysql驱动
- 编写三层架构
- 修改配置文件db配置、mybatis配置
- 测试访问
过程:
-
sql文件
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL, `password` varchar(50) DEFAULT NULL, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '张三'); INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四'); SELECT * FROM user;
-
选择版本+依赖
-
三层架构
@RestController @RequestMapping("user") public class UserController { @Autowired private UserService userService; /** * @Author: guobuyi * @Date: 11:28 2020/9/18 * @Params [] * @ReturnType: List<User> * @Description: 查询所有用户 */ @RequestMapping("findAll") public List<User> findAll(){ return userService.findAll(); } } public interface UserService { /** * @Author: guobuyi * @Date: 11:28 2020/9/18 * @Params [] * @ReturnType: List<User> * @Description: 查询所有用户 */ List<User> findAll(); } @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; /** * @Author: guobuyi * @Date: 11:28 2020/9/18 * @Params [] * @ReturnType: List<User> * @Description: 查询所有用户 */ @Override public List<User> findAll() { return userDao.findAll(); } } @Mapper //声明是一个mapper接口 @Repository //注入到spring容器中 public interface UserDao { /** * @Author: guobuyi * @Date: 11:28 2020/9/18 * @Params [] * @ReturnType: List<User> * @Description: 查询所有用户 */ List<User> findAll(); }
-
mapper.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.dao.UserDao"> <select id="findAll" resultType="user"> select * from user </select> </mapper>
-
配置文件
#db配置 spring: datasource: #serverTimezone=UTC 时区必须添加 url: jdbc:mysql://127.0.0.1/itheima?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver username: root password: root #mybatis mybatis: mapper-locations: classpath:mapper/*.xml #mapper.xml位置 type-aliases-package: com.itheima.pojo #实体位置
-
访问
http://localhost:8080/user/findAll
2. 整合redis
目标:
- 用于做查询所有用户的缓存
步骤:
- 导入redis依赖—》starter
- 修改配置文件—》redis
- 从缓存中获取用户数据
- 如果获取到直接返回
- 如果没有获取到从db查询,并且将查询结果转为json字符串放入redis再返回
过程:
-
redis依赖
<!--redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
-
业务逻辑
@RequestMapping("findAllStr") public String findAllStr(){ String userStr = null; //1.从缓存中获取数据 userStr= (String) redisTemplate.boundValueOps("31_findAll").get(); //2.如果获取到数据将数据赋值给userStr if(StringUtils.isEmpty(userStr)){ //如果userStr为空则返回true log.info("从redis中没有获取到数据,走db获取"); //3.如果获取不到数据查询db List<User> userList = userService.findAll(); //4.将json后的字符串赋值给userStr userStr = JSON.toJSONString(userList); //5.将db中的数据json转为字符串存入redis redisTemplate.boundValueOps("31_findAll").set(userStr); } return userStr; }
3. 使用RestTemplate
介绍:是一个支持http restful风格请求的工具类。
使用:
请求百度 http://www.baidu.com
请求UserController---->findAll
/*
测试百度
*/
@Test
public void case01() {
String forObject = restTemplate.getForObject("http://www.baidu.com", String.class);
System.out.println(forObject);
}
/*
测试userController中的findAllStr
*/
@Test
public void case02() {
List forObject = restTemplate.getForObject("http://localhost:8080/user/findAll", List.class);
System.out.println(forObject);
}
4. 测试类的使用
五、boot进阶
1. starters
一系列jar包的集合
有部分依赖为灰色是由于maven依赖的传递。
2. 父依赖作用
用于声明jar包的版本,防止jar包冲突,省却java程序员自己去适配jar版本。
3. 自动配置实现逻辑
在spring4.0时提出了一个Condition判断条件,如果判断条件为true则bean对象会被声明并注入到容器中,如果判断条件为false则不会声明注入到容器中。
4. 代码演示User Bean对象注入
步骤:
-
创建spring-boot-03
-
创建User 对象
-
创建UserConfig配置类—》声明User bean
@Configuration //声明是一个配置类 public class UserConfig { /* 在BeanFactory中可以获取到User bean 对象 */ @Bean public User user(){ User user = new User(); user.setName("金莲"); user.setAge(16); return user; } }
-
在启动类中获取User bean
public static void main(String[] args) { //在BeanFactory中可以获取到User bean 对象 ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringBoot03Application.class, args); Object user = applicationContext.getBean("user"); System.out.println(user); }
condition原生注解使用
@Configuration //声明是一个配置类
public class UserConfig {
/*
在BeanFactory中可以获取到User bean 对象
*/
@Bean
//conditional原生注解决定是否完成注入,重写了matches方法,根据redisTemplate是否可以反射创建决定true和false
@Conditional(Myconditional.class)
public User user(){
User user = new User();
user.setName("金莲");
user.setAge(16);
return user;
}
}
public class Myconditional implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//要求根据当前环境中是否有redisTemplate.class决定返回值,如果有则返回true,如果没有则返回false
boolean flag = true;
try {
Class<?> aClass = Class.forName("org.springframework.data.redis.core.RedisTemplate");
} catch (ClassNotFoundException e) {
e.printStackTrace();
flag = false;
}
return flag;
}
}
condition派生注解使用
public class Apple {
private String name;
}
@Configuration //声明是一个配置类
public class UserConfig {
/* @Bean
public Apple apple(){
return new Apple();
}*/
/*
在BeanFactory中可以获取到User bean 对象
*/
@Bean
//conditional原生注解决定是否完成注入
//@Conditional(Myconditional.class)
//@ConditionalOnBean(Apple.class) //如果当前spring容器中存在Apple bean那么返回true,否则为false
//@ConditionalOnMissingBean(Apple.class) //如果当前spring容器中不存在Apple bean那么返回true
@ConditionalOnProperty(name = "itheima", havingValue = "31") //如果当前配置文件中存在key=itheima val=31 那么返回true,否则false
public User user(){
User user = new User();
user.setName("金莲");
user.setAge(16);
return user;
}
}
5. redis自动配置实现
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
6. tomcat自动配置实现
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
7. 自动配置小结
自动配置的实现:
- spring4.0提出了condition相关注解,增加判断条件
- boot中实现自动配置的判断条件一般为starters中的类
六、打包部署
1. jar(推荐)
通过ideamaven project---->package打包即可
java -jar xxx.jar
2.war(不建议)
步骤:
-
在pom中声明要打为war包
<packaging>war</packaging>
-
需要创建类继承SpringBootServletInitializer并且重写config方法
public class MyServlet extends SpringBootServletInitializer { /* web.xml */ @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(SpringBoot01Application.class); } }
-
通过ideamaven project---->package打包即可
注意事项:
- 使用tomcat部署时要注意版本兼容问题
- 在访问时要注意使用的是tomcat的端口号
- 在访问时要添加项目的根路径才可以访问到