SpringBoot工作日记(2) ——springboot配置文件及项目结构

这几天有点忙,中间还写了别的博客。

之前了解了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,否则热部署会不起效

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值