SpringBoot的yml使用
- SpringBoot默认读取application.yml或者application.properties文件
- yml文件比propertiess的配置文件更加的简约
- yml更加具有层次结构
server:
port: 8090
context-path: /xiyou
- 写完一个之后冒号后面一定要有一个空格
- 如果要有父子关系(如上面的server和port)一定要加两个空格(最好写两个,并不是一定需要两个,也可以写多个)
SpringBoot的jar打包方式
- Jar类型打包方式
(1)maven进行打包:
- 先进入到项目的目录中去,到待打包的项目目录中
- 输入mvn package,就会出现一个jar包,如果已经有jar包,先输入mvn clean
- java -jar 运行该jar包即可
- 注意
此时有可能报错,运行报错,显示没有找到主清单属性。表示的是我们在运行的时候找不到main函数,没有告诉其主函数是哪个,所以我们需要在打包前的pom文件中加入一个配置,告诉其主入口是哪个
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<maimClass>com.xiyou.app.TestApplication</maimClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
其中< maimClass>com.xiyou.app.TestApplication< /maimClass>该标签用来告知其main函数在哪里,告知打包后的主入口是哪个,这里表示的主入口是com.xiyou.qpp包下的TestApplication类。这里maimClass和mainClass标签都是可以的
- war类型打包方式
有JSP的情况下一定要打包成war类型的,因为SpringBoot对JSP的支持不好,一定要打包成war类型 - 在是war类型的pom文件中,有可能会报错,意思是缺少xml文件,这时候我们不需要管他。毕竟Springboot不需要xml文件
- 其打包方式和jar类型的一致,进入到工程里,先mvn clean,再mvn package
- 打好的包需要放到tomcat下去运行
注意问题:
- 在SpringBoot2.0的时候,Tomcat的内置版本是8.5.28
- 若我们将war包打包好之后放到了外部的tomcat容器中运行,若我们的外部tomcat容器版本低于8.5.28(我们当前用的SpringBoot2.0所以内置版本是这个),会发生异常。所以我们的外部tomcat版本应该高一点
- 外部tomcat访问的时候不能像Springboot启动一样,我们需要加上项目名。
- SpringBoot2.0之前如果不在pom中指定路径,我们则找不到页面,但是2.0之后,我们就无需指定了
SpringBoot整合JDBC
- pom依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xiyou</groupId>
<artifactId>springboot-datasource</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- mysql 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- springboot-web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<!-- jdbcTemplate 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
- application.properties
server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3307/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.show-sql=true
- Controller层
package com.xiyou.datasource.controller;
import com.xiyou.datasource.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 测试controller
*/
@RequestMapping("/test")
@RestController
public class TestController {
@Autowired
private UserService userService;
@GetMapping("/jdbc/{username}/{age}")
public String createtUser(@PathVariable String username, @PathVariable Integer age){
userService.createUser(username, age);
return "JDBC-TEST-OK";
}
}
- UserService
package com.xiyou.datasource.service;
/**
* 用户的接口类
*/
public interface UserService {
/**
* 新增用户
* @param name
* @param age
*/
public void createUser(String name, Integer age);
}
- UserServiceImpl
package com.xiyou.datasource.service.impl;
import com.xiyou.datasource.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
/**
* 自动注入的
*/
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 新增用户
* @param name
* @param age
*/
@Override
public void createUser(String name, Integer age) {
jdbcTemplate.update("insert into t_user(userName, age) values (?, ?)", name, age);
}
}
- User类
package com.xiyou.datasource.po;
/**
* 对应着数据库的表
*/
public class User {
private Integer userId;
private String userName;
private Integer age;
}
- 主启动类
package com.xiyou.datasource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyDatasourceApplication {
public static void main(String[] args) {
SpringApplication.run(MyDatasourceApplication.class, args);
}
}
热部署
- 所谓的热部署就是指的是在应用程序不停止的情况下,实现新的部署
- 热部署的原理就是使用类加载器重新读取字节码文件到JVM内存中去
- 如何纯手写热部署功能:
(1)监听class文件是否发生改变(利用版本号和修改时间做监听)
(2)如果class文件发生了改变,则使用classLoader重新进行读取 - 热部署是不推荐用在生产环境上的,性能不好,也不安全
- 热部署是用在本地开发中的。目的是为了提高效率
- 项目比较大的情况下,是非常卡的。
- 一般情况下不推荐热部署
使用Devtools进行热部署
- 有些工具是自带热部署功能的,即使没有在SpringBoot中集成热部署,也可以实现。
- 在热部署测试的时候,不要改当前的方法进行测试,对class文件修改进行测试,就表示直接新增方法进行测试,不要修改这个方法,有可能修改方法是工具自带的热部署生效的
- spring-boot-devtools是一个为开发者服务的一个模块,其中最为重要的功能就是自动应用代码更改到最新的App上面去。原理就是在发现代码有更改之后,重新启动应用,但是速度比手动停止在启动还要快,更快指的不是节省出来的手工操作的时间。
- 其深层原理是使用了两个ClassLoader,一个用来加载哪些不会发生改变的类,如第三方Jar包等,另一个加载哪些会更改的类,称为restart ClassLoader,这样在有代码更改单的时候,原来的restart ClassLoader被丢弃,重新创建一个restart ClassLoader,由于需要加载的类比较少,所以有较快的启动时间(5秒以内)
- 只需要添加依赖即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
- Devtools的原理
- devtools会监听classpath下的文件改动,并且会立即重启应用(发生在保存的时候),因为其采用虚拟机的机制,重启较快(上面已经说明了具体原因)
- devtools可以实现页面热部署(即页面修改后立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现。不同的模板配置不同)