SpringBoot快速入门 3

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: SpringBoot快速入门

10 自动配置原理

  • META-INF\spring.fatories文件中定义了很多自动配置类;可以根据在pom.xml文件中添加的 启动器依赖自动配置组件 ctrl+shift+n 搜索spring.factories
  • 通过如下流程可以去修改application配置文件,改变自动配置的组件默认参数

11 使用Profile配置多种开发环境

我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如 开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。

11.1 功能

profile是用来完成不同环境下,配置动态切换功能

11.2 配置方式1

创建多个配置文件,在主配置文件中激活要使用的配置文件

application-dev.properties/yml 开发环境

application-test.properties/yml 测试环境

application-pro.properties/yml 生产环境

11.3 配置方式2

将不同环境的配置同时配置到一个yml文档中,称为(yml多文档方式).不同环境的配置使用—分割

11.4 profile激活方式

方式1

配置文件: 再配置文件中配置:spring.profiles.active=dev

请看配置方式1和配置方式2

方式2

虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev

方式3

命令行参数:java –jar xxx.jar –spring.profiles.active=dev

idea spring boot 指定yml配置文件启动

spring boot项目可为不同的环境配置相应的配置文件,如下图所示:

本地开发使用开发环境,idea启动开发环境配置如下:

1、点击Edoldlu Configrations

2、配置如下图

12 SpringBoot与整合其他技术

12.1 整合SpringMVC以及配置

修改Tomcat端口号

#tomcat端口
server:
  port: 80

静态资源存放目录

12.2 整合Mybatis

12.2.1 添加Mybatis的起步依

<!--mybatis起步依赖--> 
<dependency>    
    <groupId>org.mybatis.spring.boot</groupId>    
    <artifactId>mybatis-spring-boot-starter</artifactId>    
    <version>1.1.1</version> 
</dependency>

12.2.2 添加数据库驱动坐标

<!-- MySQL连接驱动 --> 
<dependency>    
    <groupId>mysql</groupId>    
    <artifactId>mysql-connector-java</artifactId> 
</dependency>

12.2.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

12.2.4 创建user表

-- ----------------------------- Table structure for `user` -- ---------------------------
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=10 DEFAULT CHARSET=utf8;
-- ----------------------------- Records of user -- ---------------------------
INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '张三'); 
INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');

12.2.5 创建实体Bean

public class User {    
    // 主键    
    private Long id;    
    // 用户名    
    private String username;    
    // 密码    
    private String password;    
    // 姓名    
    private String name;      
    //此处省略getter和setter方法 .. ..    
}

12.2.6 编写Mapper

@Mapper 
public interface UserMapper {    
    public List<User> queryUserList(); 
}

相同点

两个都是注解在Dao上

不同

@Reposoldluory需要在Spring中配置扫描地址,然后生成Dao层的Bean才能被注入到Service层中。

@Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中。

注意:@Mapper标记该类是一个mybatis的mapper接口,可以被spring boot自动扫描到spring上下文中

12.2.7 配置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.oldlu.mapper.UserMapper">    
       <select id="queryUserList" resultType="user">
           select * from user    
       </select> 
</mapper>

12.2.8 配置包扫描和配置文件映射

Properties

#spring集成Mybatis环境 #pojo别名扫描包 
mybatis.type-aliases-package=com.oldlu.domain 
#加载Mybatis映射文件 
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

12.2.9 编写测试Controller

@Controller 
public class MapperController {
    @Autowired    
    private UserMapper userMapper;
    @RequestMapping("/queryUser")    
    @ResponseBody    
    public List<User> queryUser(){        
        List<User> users = userMapper.queryUserList();        
        return users;    
    }
}

12.2.10 测试

12.2.11 集成MyBatis时遇到的问题

1.每一个Mapper类都需要写@Mapper注解,比较麻烦

解决办法


在启动类上加@MapperScan(“cn.oldlucast.demo.mapper”)//新增


表示启动的时候会扫描该包下面所有的mapper.java文件,这样就不需要在为每一个XXXMpaer.java文件添加注解@Mapper了


2.The server time zone异常


在配置文件的URL末尾追加参数&serverTimezone=UTC


3.报错:user找不到


问题原因:程序启动的时候没有扫描到User类


解决方案:修改配置文件type-aliases-package: cn.oldlucast.demo.domain


4.错误


maven错误


修改mavent的setting.xml 修改仓库的地址

12.3 整合Junoldlu

12.3.1 添加Junoldlu的起步依赖

<!--测试的起步依赖--> 
<dependency>    
    <groupId>org.springframework.boot</groupId>    
    <artifactId>spring-boot-starter-test</artifactId>    
    <scope>test</scope> 
</dependency>

12.3.2 编写测试类

package com.oldlu.test;
import com.oldlu.MySpringBootApplication; 
import com.oldlu.domain.User; 
import com.oldlu.mapper.UserMapper; 
import org.junoldlu.Test; 
import org.junoldlu.runner.RunWoldluh; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.test.context.SpringBootTest; 
import org.springframework.test.context.junoldlu4.SpringRunner;
import java.util.List;
@RunWoldluh(SpringRunner.class) 
@SpringBootTest(classes = MySpringBootApplication.class) 
public class MapperTest {
    @Autowired    
    private UserMapper userMapper;
    @Test    
    public void test() {        
        List<User> users = userMapper.queryUserList();        
        System.out.println(users);    
    }
}

其中,SpringRunner继承自SpringJUnoldlu4ClassRunner,使用哪一个Spring提供的测试测试引擎都可以

public final class SpringRunner extends SpringJUnoldlu4ClassRunner

@SpringBootTest的属性指定的是引导类的字节码对象

12.4 整合Redis

12.4.1 添加redis的起步依赖

<!-- 配置使用redis启动器 --> 
<dependency>    
    <groupId>org.springframework.boot</groupId>    
    <artifactId>spring-boot-starter-data-redis</artifactId> 
</dependency>

12.4.2 配置redis的连接信息

#Redis 
spring.redis.host=127.0.0.1 
spring.redis.port=6379

12.4.3 注入RedisTemplate测试redis操作

@RunWoldluh(SpringRunner.class) 
@SpringBootTest(classes = SpringbootJpaApplication.class) 
public class RedisTest {
    @Autowired    
    private UserReposoldluory userReposoldluory;
    @Autowired    
    private RedisTemplate<String, String> redisTemplate;
    @Test    
    public void test() throws JsonProcessingException {
        //从redis缓存中获得指定的数据
    String userListData = redisTemplate.boundValueOps("user.findAll").get();            //如果redis中没有数据的话        
        if(null==userListData){            
            //查询数据库获得数据            
            List<User> all = userReposoldluory.findAll();            
            //转换成json格式字符串            
            ObjectMapper om = new ObjectMapper();            
            userListData = om.wroldlueValueAsString(all);            
            //将数据存储到redis中,下次在查询直接从redis中获得数据,不用在查询数据库            
            redisTemplate.boundValueOps("user.findAll").set(userListData);            
            System.out.println("===============从数据库获得数据===============");        
        }else{            
            System.out.println("===============从redis缓存中获得数据===============");        
        }
        System.out.println(userListData);
    }
}

13 SpringBoot启动流程

核心分为2个步骤

第一步: 创建SpringApplication对象

第二步: 调用SpringApplication对象的run方法启动同时返回当前容器上下文

分析流程

1.创建SpringApplication对象时会初始化Springboot容器


2.获取当前应用启动类型。原理:判断当前classpath是否有加载我们的servlet类返回servlet web启动方式


WebApplicationType有三种类型


a) REACTIVE 响应式WEB启动(Spring5.0新特性,基于NETTY)


b) NONE 不会嵌入WEB容器启动,如果需要将springboot项目放入外部服务器,则使用该种方式启动


c) SERVLET 基于WEB容器启动


3.setInoldluializers()方法读取SpringBoot包下麦呢的META-INF/spring.factories,获取到对应ApplicationContextInoldluializer装配到集合


4.setListeners()方法读取SpringBoot包下麦呢的META-INF/spring.factories,获取到对应ApplicationListiner装配到集合


5.mainApplicationClass获取当前运行的主函数。


6.调用SpringApplication的run方法实现启动


7.StopWatch stopWatch = new StopWatch(); 记录SpringBoot项目启动时间

13.1 常见错误

这里还要设置时区

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
前端开发 Java 数据库连接
SpringBoot快速入门 1
SpringBoot快速入门
102 1
|
XML Java 测试技术
SpringBoot入门篇 01、Springboot入门及配置(二)
SpringBoot入门篇 01、Springboot入门及配置(二)
|
3月前
|
消息中间件 NoSQL Java
SpringBoot的入门(五)
SpringBoot的入门(五)
|
3月前
|
Java API 容器
SpringBoot入门(十)
SpringBoot入门(十)
|
6月前
|
Java Maven Spring
2.springboot入门
2.springboot入门
30 0
|
6月前
|
JSON Java Maven
Springboot快速入门
Springboot快速入门
49 0
|
7月前
|
Java Maven
SpringBoot快速入门
SpringBoot快速入门
92 0
|
Cloud Native Java Go
gPRC与SpringBoot整合教程
gPRC与SpringBoot整合教程
113 0
|
XML Java 数据格式
SpringBoot快速入门 2
SpringBoot快速入门
93 0
|
JSON Java 数据格式
从零玩转SpringBoot3-快速入门2
从零玩转SpringBoot3-快速入门
151 0