SpringBoot
2.选择当前模块需要使用的技术集
3.开发控制器类
1 @RestController 2 @RequestMapping("/books") 3 public class BookController { 4 @GetMapping("/{id}") 5 public String getById(@PathVariable Integer id) { 6 System.out.println("id ==> " + id); 7 return "hello , spring boot! "; 8 } 9 }
4.运行自动生成的Application类
最简SpringBoot程序所包含的基础文件:
pom.xml文件
Application类
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.5.0</version> 9 </parent> 10 <groupId>com.test</groupId> 11 <artifactId>springboot-01-quickstart</artifactId> 12 <version>0.0.1-SNAPSHOT</version> 13 <dependencies> 14 <dependency> 15 <groupId>org.springframework.boot</groupId> 16 <artifactId>spring-boot-starter-web</artifactId> 17 </dependency> 18 </dependencies> 19 </project>
1 @SpringBootApplication 2 public class Application { 3 public static void main(String[] args) { 4 SpringApplication.run(Application.class, args); 5 } 6 }
Spring程序与SpringBoot程序对比
注:基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构
2.执行启动指令
java -jar springboot_01_quickstart.jar # 项目的名称根据实际情况修改
注:jar支持命令行启动需要依赖maven插件支持,请确认打包时是否具有SpringBoot对应的maven插件
1 <build> 2 <plugins> 3 <plugin> 4 <groupId>org.springframework.boot</groupId> 5 <artifactId>spring-boot-maven-plugin</artifactId> 6 </plugin> 7 </plugins> 8 </build>
SpringBoot概述
SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。
Spring程序缺点:
配置繁琐
依赖设置繁琐
SpringBoot程序优点:
自动配置
起步依赖(简化依赖配置)
辅助功能(内置服务器,……)
starter:
SpringBoot中常见项目名称,定义了当前项目使用的所有项目坐标,以达到减少依赖配置的目的
parent:
所有SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的
spring-boot-starter-parent(2.5.0)与 spring-boot-starter-parent(2.4.6)共计57处坐标版本不同
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.5.0</version> 9 </parent> 10 <groupId>com.test</groupId> 11 <artifactId>springboot-01-quickstart</artifactId> 12 <version>0.0.1-SNAPSHOT</version> 13 <dependencies> 14 <dependency> 15 <groupId>org.springframework.boot</groupId> 16 <artifactId>spring-boot-starter-web</artifactId> 17 </dependency> 18 </dependencies> 19 </project>
实际开发
使用任意坐标时,仅书写GAV中的G和A,V由SpringBoot提供
如发生坐标错误,再指定version(要小心版本冲突)
1 <dependency> 2 <groupId>junit</groupId> 3 <artifactId>junit</artifactId> 4 <version>${junit.version}</version> 5 </dependency> 6 <dependency> 7 <groupId>javax.servlet</groupId> 8 <artifactId>javax.servlet-api</artifactId> 9 <version>${servlet-api.version}</version> 10 </dependency>
SpringBoot程序启动
1 @SpringBootApplication 2 public class Springboot01QuickstartApplication { 3 public static void main(String[] args) { 4 SpringApplication.run(Springboot01QuickstartApplication.class, args); 5 } 6 }
SpringBoot在创建项目时,采用jar的打包方式。
SpringBoot的引导类是项目的入口,运行main方法就可以启动项目。
使用maven依赖管理变更起步依赖项
Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty
1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-web</artifactId> 5 <!--web起步依赖环境中,排除Tomcat起步依赖--> 6 <exclusions> 7 <exclusion> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-tomcat</artifactId> 10 </exclusion> 11 </exclusions> 12 </dependency> 13 <!--添加Jetty起步依赖,版本由SpringBoot的starter控制--> 14 <dependency> 15 <groupId>org.springframework.boot</groupId> 16 <artifactId>spring-boot-starter-jetty</artifactId> 17 </dependency> 18 </dependencies>
http://localhost:8080/books/1 => http://localhost/books/1
SpringBoot提供了多种属性配置方式:(在resources下创建以下文件)
application.properties
server.port=80
application.yml(常用)
server:
port: 81
application.yaml
server:
port: 82
SpringBoot配置文件加载顺序(了解)
application.properties > application.yml > application.yaml
注:SpringBoot核心配置文件名为application;
SpringBoot内置属性过多,且所有属性集中在一起修改,在使用时,通过提示键+关键字修改属性。
YAML(YAML Ain't Markup Language),一种数据序列化格式。
优点:
容易阅读
容易与脚本语言交互
以数据为核心,重数据轻格式
YAML文件扩展名:
.yml(主流)
.yaml
大小写敏感
属性层级关系使用多行描述,每行结尾使用冒号结束
使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
# 表示注释
核心规则:数据前面要加空格与冒号隔开!!!
1 lesson: SpringBoot 2 3 server: 4 port: 82 5 6 enterprise: 7 name: itcast 8 age: 16 9 tel: 4006184000 10 subject: 11 - Java 12 - 前端 13 - 大数据
1.使用@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名……}
1 @RestController 2 @RequestMapping("/books") 3 public class BookController { 4 @Value("${lesson}") 5 private String lessonName; 6 7 @Value("${server.port}") 8 private int port; 9 10 @Value("${enterprise.subject[1]}") 11 private String[] subject_01; 12 }
2.封装全部数据到Environment对象
1 @RestController 2 @RequestMapping("/books") 3 public class BookController { 4 @Autowired 5 private Environment env; 6 @GetMapping("/{id}") 7 public String getById(@PathVariable Integer id){ 8 System.out.println(env.getProperty("lesson")); 9 System.out.println(env.getProperty("enterprise.name")); 10 System.out.println(env.getProperty("enterprise.subject[0]")); 11 return "hello , spring boot!"; 12 } 13 }
3.自定义对象封装指定数据(常用)
1 @Component 2 @ConfigurationProperties(prefix = "enterprise") 3 public class Enterprise { 4 private String name; 5 private Integer age; 6 private String tel; 7 private String[] subject; 8 ... //getter、setter、toString()等方法 9 }
1 @RestController 2 @RequestMapping("/books") 3 public class BookController { 4 @Autowired 5 private Enterprise enterprise; 6 7 @GetMapping("/{id}") 8 public String getById(@PathVariable Integer id){ 9 System.out.println(enterprise); 10 return "hello , spring boot!"; 11 } 12 }
自定义对象封装数据警告解决方案:
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-configuration-processor</artifactId> 4 <optional>true</optional> 5 </dependency>
1 #设置启用的环境 2 spring: 3 profiles: 4 active: dev 5 --- 6 #开发(推荐格式) 7 spring: 8 config: 9 activate: 10 on-profile: dev 11 server: 12 port: 80 13 --- 14 #生产(过时格式) 15 spring: 16 profiles: pro 17 server: 18 port: 81 19 --- 20 #测试 21 spring: 22 profiles: test 23 server: 24 port: 82
properties文件多环境启动
主启动配置文件application.properties
spring.profiles.active=pro
环境分类配置文件application-pro.properties
server.port=80
环境分类配置文件application-dev.properties
server.port=81
环境分类配置文件application-test.properties
server.port=82
带参数启动SpringBoot:
java –jar springboot.jar --spring.profiles.active=test #修改环境启动
java –jar springboot.jar --server.port=88 #修改端口启动
java –jar springboot.jar --server.port=88 --spring.profiles.active=test #修改环境及端口启动
参数加载优先顺序:
查看https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config
Maven与SpringBoot多环境兼容
1 <profiles> 2 <profile> 3 <id>dev_env</id> 4 <properties> 5 <profile.active>dev</profile.active> 6 </properties> 7 <activation> 8 <activeByDefault>true</activeByDefault> 9 </activation> 10 </profile> 11 <profile> 12 <id>pro_env</id> 13 <properties> 14 <profile.active>pro</profile.active> 15 </properties> 16 </profile> 17 <profile> 18 <id>test_env</id> 19 <properties> 20 <profile.active>test</profile.active> 21 </properties> 22 </profile> 23 </profiles>
2.SpringBoot中引用Maven属性(application.yml)
1 spring: 2 profiles: 3 active: ${profile.active} 4 --- 5 spring: 6 profiles: pro 7 server: 8 port: 80 9 --- 10 spring: 11 profiles: dev 12 server: 13 port: 81 14 --- 15 spring: 16 profiles: test 17 server: 18 port: 82
3.执行Maven打包指令
Maven指令执行完毕后,生成了对应的包,其中类参与编译,但是配置文件并没有编译,而是复制到包中
解决思路:对于源码中非java类的操作要求加载Maven对应的属性,解析${}占位符
4.对资源文件开启对默认占位符的解析(pom.xml)
1 <build> 2 <plugins> 3 <plugin> 4 <artifactId>maven-resources-plugin</artifactId> 5 <configuration> 6 <encoding>utf-8</encoding> 7 <useDefaultDelimiters>true</useDefaultDelimiters> 8 </configuration> 9 </plugin> 10 </plugins> 11 </build>
Maven打包加载到属性,打包顺利通过
SpringBoot中4级配置文件:
1级:file(打包后文件夹中):config/application.yml 【优先级最高】
2级:file(打包后文件夹中):application.yml
3级:classpath(打包前项目中):config/application.yml
4级:classpath(打包前项目中):application.yml 【优先级最低】
作用:
1级与2级留做系统打包后设置通用属性。
3级与4级用于系统开发阶段设置通用属性。
Spring整合JUnit(复习)
SpringBoot整合JUnit
1.添加整合junit起步依赖(创建SpringBoot项目自带)
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-test</artifactId> 4 <scope>test</scope> 5 </dependency>
2.编写测试类,创建SpringBoot默认自动生成了一个(加粗为手动添加代码)
1 @SpringBootTest 2 class Springboot07JunitApplicationTests { 3 @Autowired 4 private BookService bookService; 5 6 @Test 7 public void testSave() { 8 bookService.save(); 9 } 10 }
@SpringBootTest
类型:测试类注解
位置:测试类定义上方
作用:设置JUnit加载的SpringBoot启动类。
相关属性:classes:设置SpringBoot启动类。
注:如果测试类在SpringBoot启动类的包或子包中,可以省略启动类的设置,也就是省略classes的设定。
SpringConfig
导入JdbcConfig
导入MyBatisConfig
1 @Configuration 2 @ComponentScan("com.test") 3 @PropertySource("classpath:jdbc.properties") 4 @Import({JdbcConfig.class, MyBatisConfig.class}) 5 public class SpringConfig { 6 }
JDBCConfig
定义数据源(加载properties配置项:driver、url、username、password)
1 #jdbc.properties 2 jdbc.driver=com.mysql.jdbc.Driver 3 jdbc.url=jdbc:mysql://localhost:3306/spring_db 4 jdbc.username=root 5 jdbc.password=root
1 public class JdbcConfig { 2 @Value("${jdbc.driver}") 3 private String driver; 4 @Value("${jdbc.url}") 5 private String url; 6 @Value("${jdbc.username}") 7 private String userName; 8 @Value("${jdbc.password}") 9 private String password; 10 11 @Bean 12 public DataSource getDataSource() { 13 DruidDataSource ds = new DruidDataSource(); 14 ds.setDriverClassName(driver); 15 ds.setUrl(url); 16 ds.setUsername(userName); 17 ds.setPassword(password); 18 return ds; 19 } 20 }
MyBatisConfig
定义SqlSessionFactoryBean
1 @Bean 2 public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource) { 3 SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); 4 ssfb.setTypeAliasesPackage("com.test.domain"); 5 ssfb.setDataSource(dataSource); 6 return ssfb; 7 }
定义映射配置
1 @Bean 2 public MapperScannerConfigurer getMapperScannerConfigurer() { 3 MapperScannerConfigurer msc = new MapperScannerConfigurer(); 4 msc.setBasePackage("com.test.dao"); 5 return msc; 6 }
SpringBoot整合Spring(不存在)
SpringBoot整合SpringMVC(不存在)
SpringBoot整合MyBatis(主要)
1.创建新模块,选择Spring初始化,并配置模块相关基础信息
2.选择当前模块需要使用的技术集(MyBatis、MySQL)
3.在application.yml中设置数据源参数
1 spring: 2 datasource: 3 driver-class-name: com.mysql.cj.jdbc.Driver 4 url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC 5 username: root 6 password: root 7 type: com.alibaba.druid.pool.DruidDataSource
注:SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区,或在MySQL数据库端配置时区解决此问题
jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
4.定义数据层接口与映射配置(设置@Mapper)
1 @Mapper 2 public interface UserDao { 3 @Select("select * from tbl_book where id=#{id}") 4 Book getById(Integer id); 5 }
5.测试类中注入dao接口,测试功能
1 @SpringBootTest 2 class Springboot08MybatisApplicationTests { 3 @Autowired 4 private BookDao bookDao; 5 6 @Test 7 public void testGetById() { 8 Book book = bookDao.getById(1); 9 System.out.println(book); 10 } 11 }
1 <!-- todo 1 添加druid连接池依赖--> 2 <dependency> 3 <groupId>com.alibaba</groupId> 4 <artifactId>druid</artifactId> 5 <version>1.2.6</version> 6 </dependency>
2.复制springmvc工程各种资源(主java类、页面、测试类)
3.删除config包中的所有配置,在BookDao接口上加@Mapper注解
1 //todo 3 在BookDao接口上加@Mapper注解,让SpringBoot给接口创建代理对象 2 @Mapper 3 public interface BookDao { 4 //... 5 }
4.将application.properties修改成application.yml,配置端口号和连接参数
1 server: 2 port: 80 3 # todo 4 配置数据库连接参数 4 spring: 5 datasource: 6 driver-class-name: com.mysql.cj.jdbc.Driver 7 url: jdbc:mysql://localhost:3306/ssm_db 8 username: root 9 password: root 10 type: com.alibaba.druid.pool.DruidDataSource
5.修改BookServiceTest配置类,进行配置
1 // todo 5 修改单元测试类,添加@SpringBootTest主键,修复@Test注解导包 2 @SpringBootTest 3 public class BookServiceTest { 4 5 @Autowired 6 private BookService bookService; 7 8 @Test 9 public void testGetById(){ 10 Book book = bookService.getById(2); //传递参数1会抛出异常 11 System.out.println(book); 12 } 13 @Test 14 public void testGetAll(){ 15 List<Book> all = bookService.getAll(); 16 System.out.println(all); 17 } 18 }
6.页面放置在resources目录下的static目录中。在static目录中提供index.html页面,跳转到"pages/books.html"
1 <script> 2 location.href="pages/books.html" 3 </script>
最后:运行引导类即可访问