这几天有点忙,中间还写了别的博客。
之前了解了mybatis的自动生成器(mybatis的使用另外再写)。然后我们先理解springboot的配置文件和项目结构。
首先看图
这是我在介绍maven的时候新建工程之后截的一张图。
是的,我们只要新建maven工程就可以了,不需要选springboot工程。spring框架会在pom文件里引入。不论是Eclipse还是IDEA操作都是差不多的。如果是导入项目,也是选导入maven工程
先来看看我的pom.xml 。 在注释中讲解每个包的作用
<?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>
<!-- 定义maven的参数 指定包路径-->
<groupId>com.companyName</groupId>
<!-- 项目组名称 -->
<artifactId>template</artifactId>
<!-- 项目打包方式,我们是web项目,打war包 -->
<packaging>war</packaging>
<!-- 项目名 -->
<name>template</name>
<description>springboot模板</description>
<!-- 在这里引入spring boot 2.x 框架-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 指定字符集和一些包的版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<fastjson.version>1.2.12</fastjson.version>
<druid.version>1.0.18</druid.version>
<logbcak.version>1.1.6</logbcak.version>
<swagger.version>2.7.0</swagger.version>
<pagehelper.version>1.2.3</pagehelper.version>
</properties>
<!-- 依赖列表 -->
<dependencies>
<!-- spring boot 的核心包 自带tomcat,但是我们正式部署时是在tomcat中,所以将tomcat 移除 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- spring 的一些支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- 切面编程 使用的包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<!-- json转换工具 阿里巴巴的fastjson 非常使用,spring 默认是jackson的,但fastjson更好用 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- 数据库连接池druid 还是阿里家的产品,管理与数据库的连接-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- 日志工具包 logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.1.2</version>
<exclusions>
<exclusion>
<artifactId>logback-core</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- apche 提供的 工具类-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- 做字符处理的(不仅是),加密解密等很多操作需要 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<!-- 给前端看api 的工具,swagger,swagger 的配置会着重讲 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- mybatis 的分页工具,用这个写分页会轻松点 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- nosql 数据库redis 我用来做缓存 和键空间通知(定时任务)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</exclusion>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- 对象池 暂时没用过-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- springboot 对web的支持,在做socket的时候会用到 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 开发工具 devtools 保存之后会重启服务器。会使缓存报错,而且因为我用了JREBEL 所以我注释起来-->
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-devtools</artifactId>-->
<!--<optional>true</optional>-->
<!--<scope>runtime</scope>-->
<!--</dependency>-->
<!-- mysql 的连接包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok 一款插件,可以帮我们 自动生成get、set、tostring,和直接使用log打印日志 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mybaitis 的核心包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- tomcat 开发时使用,为什么上面特别移除了tomcat这里却又加上,因为这里设置了scope=provided,打包的时候不会加上 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--测试包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 阿里云 oss存储服务器用的包,现在图片都流行存到其他服务器 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.7.0</version>
</dependency>
<!-- xml的解析工具 -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</dependency>
</dependencies>
<!-- 下面加载一些插件-->
<build>
<plugins>
<!-- maven 的热部署插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 如果不设置fork,那么不会restart,devtools热部署不会起作用-->
<fork>true</fork>
</configuration>
</plugin>
<!-- maven 的打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<!--配置 配置文件路径 不配置会使mapper.xml会扫不到-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
pom.xml 了解之后,我们再看resources文件夹下的配置文件(别好奇为什么我的一个窗口可以看到几个项目,这样看着爽跑起来卡,而且每次都要手动导入项目。)
这里我是把test包删除了。这里面最重要的是application.yml 或application.properties
为什么是“或”,因为有一个就可以了,我基本上是使用yml的,因为我学springboot的时候讲师一直说yml的优点,所以我的properties是空白的。
那我们看看application.yml
#Spring
spring:
#profile 指定使用哪个配置文件
profiles:
active: dev
#datasource 数据库连接池参数
datasource:
url: jdbc:mysql://localhost:3306/test
username: test
password: test
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
jmx:
default-domain: test
#将date转成时间戳,时间戳对前端来说比较友好,所以序列化的时候全部转时间戳。上面说了spring默认用jackson
jackson:
serialization:
write-dates-as-timestamps: true
#redis 缓存的参数,给redis配置默认参数
redis:
host: localhost
port: 6379
password: password
timeout: 5000ms
jedis:
pool:
#最大空闲数
max-idle: 300
#最大连接数
max-total: 600
#最小空闲数
min-idle: 1
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: 5000ms
#最大连接数
max-active: 8
# 指定使用的数据库
database: 0
#指定缓存的类型,我用的是redis
cache:
type: redis
#mybatis 的配置,告诉mybatis mapper 和pojo 在哪里。下面用了通配符。如果你的项目结构习惯和我不一样,自己改
mybatis:
mapper-locations: classpath:com/dingguan/**/**.xml
type-aliases-package: classpath:com.dingguan.**.pojo
第一个配置spring.profile.active里面我指定了dev。那么spring会加载application-dev.yml中的配置,且会优于application.yml。
同理,如果我指定的是prod ,那么就加载application-prod.yml。
这里为什么我分了dev(开发环境)、prod(生产环境,就是正式部署时)、test(测试环境),因为我们考虑到是先开发再测试、再部署,然而不同机器之间的端口或者项目名可能不同,所以分三种情况去配置,我们只需要在这里改一下用哪个配置文件就可以改对应环境了。
那我们来看看我三个文件分别是如何
dev:
server:
#启动端口
port: 8082
#log
logging:
config: classpath:logback-dev.xml
prod:
server:
#启动端口
port: 8080
#项目前缀
spring:
application: /template
#log
logging:
config: classpath:logback.xml
test:
server:
#启动端口
port: 8080
#项目前缀
spring:
application: /test/template
#log
logging:
config: classpath:logback.xml
这么一看内容不多而且也很相似。那是因为我还是低阶的开发者,会的配置还不多,等进阶之后会分出更多内容来。
像我的参数环境是用的8082端口,而且没有配项目名,所以localhost:8082就可以访问到。但是挂测试服的时候因为tomcat是8080端口的,所以用8080端口并且加上项目前缀。因为小程序必须要SSL证书,所以我的测试服是通过正式服用nginx进行转发的,所以需要加一个前缀/test 。正式服就没有/test前缀了。
然后我的logback 也指定了两个配置文件。因为不同环境我需要打印日志的需求不同。logback配置如下
logback.xml: 正式和测试环境是把日志存到/usr/java/logs/项目名 下,并且会打印到tomcat的日志里
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- todo -->
<property name="LOG_HOME" value="/usr/java/logs/template" />
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{H:mm} %-5level [%logger{16}] %msg%n</pattern>
</encoder>
</appender>
<appender name="normalLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/web.normal.%d{yyyy-MM-dd}.log
</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{16} - %msg%n
</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
</appender>
<appender name="errorLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/web.error.%d{yyyy-MM-dd}.log
</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{16} - %msg%n
</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="com.dingguan" level="debug" >
<appender-ref ref="normalLog" />
<appender-ref ref="errorLog" />
</logger>
<!--将info级的信息打印到控制台和normalLog-->
<root level="info">
<appender-ref ref="Console" />
<appender-ref ref="normalLog" />
</root>
logback-dev.xml: 开发环境只打印到控制台
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- todo -->
<property name="LOG_HOME" value="/logs" />
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{H:mm} %-5level [%logger{16}] %msg%n</pattern>
</encoder>
</appender>
<appender name="errorLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/web.error.%d{yyyy-MM-dd}.log
</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{16} - %msg%n
</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="com.dingguan" level="debug" >
<appender-ref ref="errorLog" />
</logger>
<root level="info">
<appender-ref ref="Console" />
</root>
现在resources已经讲完了,不明白的同学可以先复制粘贴,然后改账号密码就完事了,然后来看看我的项目结构习惯
com.公司名.项目名 下有数个包介绍如下:
bean - 存放一些实体类和辅助类
constants - 存放一些静态变量和配置类
filter - 存放拦截器
linstener - 存放监听器
monitor - 存放一些切面的类
web - 存放mybatis的mapper和pojo、service接口和实现、controller控制器。这个包是我主要编写代码的区域。
我习惯每个表作为一个包,这个包以表名未包名,然后下面固定四个包(controller、mapper、pojo、service)。这四个包下放的是跟这个表有关 的pojo、mapper、service、controller。还不懂得这四个单词含义的同学要等后面的文章了。
其实截图还漏了两个文件,在项目名的包下
这两个文件是springboot项目启动的方法。那个ShanyuApplication 是因为我习惯一个IDEA里打开多个项目,为了区分项目加的Shanyu前缀,如果是一个窗口一个项目的同学可以直接复制粘贴了。
Application.java:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
ServletInitializer:
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
本地开发时要启动项目的时候,就在Application.java右键->run,然后就可以在IDEA的Run DashBorad看控制台了。
如果是Eclipse,在Application.java 右键Run As Spring Boot App,否则热部署会不起效