SpringBoot的yml使用

  • SpringBoot默认读取application.yml或者application.properties文件
  • yml文件比propertiess的配置文件更加的简约
  • yml更加具有层次结构
server:
  port:  8090
  context-path: /xiyou
  • 写完一个之后冒号后面一定要有一个空格
  • 如果要有父子关系(如上面的server和port)一定要加两个空格(最好写两个,并不是一定需要两个,也可以写多个)

SpringBoot的jar打包方式

  • Jar类型打包方式
    (1)maven进行打包:
  1. 先进入到项目的目录中去,到待打包的项目目录中
  2. 输入mvn package,就会出现一个jar包,如果已经有jar包,先输入mvn clean
  3. 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的原理
  1. devtools会监听classpath下的文件改动,并且会立即重启应用(发生在保存的时候),因为其采用虚拟机的机制,重启较快(上面已经说明了具体原因)
  2. devtools可以实现页面热部署(即页面修改后立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现。不同的模板配置不同)