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 常见错误
这里还要设置时区