0 Star 0 Fork 0

tangcco / springboot

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

springboot-demo

springboot-demo

01.idea

​ idea 快速构建 springboot项目

02.官网

​ 官网 构建 springboot项目

03.maven

​ maven 构建 springboot项目

04.DevTools

​ DevTools

​ springboot全局配置文件 springCloud场景下使用

  • bootstrap.yaml

  • bootstrap.yml

  • bootstrap.properties

    springboot配置文件 单体应用场景下使用

  • application.yaml

  • application.yml

  • application.properties

    application.yaml > application.yml > application.properties

    路劲 说明
    file:./config/ 工程文件夹下的config目录。
    file:/ 工程文件夹目录,如果是maven项目那么和pom.xml是一个层级
    classPath:/config/ 工程 classPath文件夹下的config文件夹
    classPath:/ 工程classpath文件夹

05.Intercepter

​ 拦截器

preHandle、postHandle与afterCompletion
preHandle

调用时间:Controller方法处理之前

执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行

若返回false,则中断执行,注意:不会进入afterCompletion


postHandle

调用前提:preHandle返回true

调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作

执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。

备注:postHandle虽然post打头,但post、get方法都能处理
 

afterCompletion

调用前提:preHandle返回true

调用时间:DispatcherServlet进行视图的渲染之后

多用于清理资源

06.servlet

springboot中使用Listener、Filter、Servlet

07.freemarker

springboot整合freemarker

08.durid

springboot整合jdbc durid

09.mybatis

springboot整合mybatis

10.mybatis plus

springboot整合 freemarker mybatis plus

11.thymeleaf

springboot整合 thymeleaf mybatis plus

12.jwt

springboot整合jwt

13.redis

springboot整合redis

14.mongodb

springboot整合mongodb

15.websocket

springboot整合websocket

16.quartz

springboot整合quartz

17.mq

springboot整合mq

18.FastDFS

springboot整合 原生 FastDFS 和 tobato

推荐使用 tobato

19.Swagger

springboot整合Swagger

20.Validation

springboot 自定义错误页面 整合数据校验

@NotBlank 字符串不能为空
@NotNull  基本数据类型对象类型的对象不能为空
@NotEmpty 集合不能为空
@Length	  爬到字符串长度最大或者最小
@Max	  最大值
@Min	  最小值

21.健康状态

http://localhost/actuator

{
    "_links": {
        "self": {
            "href": "http://localhost/actuator",
            "templated": false
        },
        "health-path": {
            "href": "http://localhost/actuator/health/{*path}",
            "templated": true
        },
        "health": {
            "href": "http://localhost/actuator/health",
            "templated": false
        },
        "info": {
            "href": "http://localhost/actuator/info",
            "templated": false
        }
    }
}

http://localhost/actuator/health

{
    "groups": [],
    "status": {
        "code": "UP",
        "description": ""
    }
}

Actuator监控分成两类:原生端点和用户自定义扩展端点,原生的主要有:

路径 描述
/autoconfig 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过
/beans 描述应用程序上下文里全部的Bean,以及它们的关系
/env 获取全部环境属性
/configprops 描述配置属性(包含默认值)如何注入Bean
/dump 获取线程活动的快照
/health 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供
/info 获取应用程序的定制信息,这些信息由info打头的属性提供
/mappings 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系
/metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数
/shutdown 关闭应用程序,要求endpoints.shutdown.enabled设置为true
/trace 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等)

springbootAdminServer

server坐标

<dependency>
	<groupId>de.codecentric</groupId>
	<artifactId>spring-boot-admin-starter-server</artifactId>
	<version>2.3.1</version>
</dependency>

client坐标

<dependency>
	<groupId>de.codecentric</groupId>
	<artifactId>spring-boot-admin-starter-client</artifactId>
	<version>2.3.1</version>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

springoot客户端配置文件

spring:
  application:
    name: admin-client
  boot:
    admin:
      client:
        url: http://localhost:2021 #客户端指定服务器端地址

management:
  endpoint:
    health:
      show-details: ALWAYS

事件日志:

{
    "registration": {
        "name": "admin-client",
        "managementUrl": "http://phoenix:80/actuator",
        "healthUrl": "http://phoenix:80/actuator/health",
        "serviceUrl": "http://phoenix:80/",
        "source": "http-api",
        "metadata": {
            "startup": "2021-01-10T18:57:09.0117091+08:00"
        }
    }
}
{
    "statusInfo": {
        "status": "OFFLINE",
        "details": {
            "exception": "org.springframework.web.reactive.function.client.WebClientRequestException",
            "message": "failed to resolve 'phoenix' after 4 queries ; nested exception is java.net.UnknownHostException: failed to resolve 'phoenix' after 4 queries "
        }
    }
}
{
    "registration": {
        "name": "admin-client",
        "managementUrl": "http://phoenix:80/actuator",
        "healthUrl": "http://phoenix:80/actuator/health",
        "serviceUrl": "http://phoenix:80/",
        "source": "http-api",
        "metadata": {
            "startup": "2021-01-10T18:43:44.2392174+08:00"
        }
    }
}

22.SpringDataJPA

logback

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别 -->
<!-- TRACE < DEBUG < INFO < WARN < ERROR  -->
<!-- 根节点<configuration>,包含下面三个属性: -->
<!-- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->    
<!-- scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->    
<!-- debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->    
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 子节点<contextName>:用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改 -->
    <contextName>xxx</contextName>
    <!-- 状态监听器  控制台监听日志-->
    <!--<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />-->
    
    <!-- 日志级别变更穿透 -->
    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator" />
    
    <!-- drop duplicate message是用来过滤重复日志的-->
    <turboFilter class="ch.qos.logback.classic.turbo.DuplicateMessageFilter"/>
    
    <!--<property scope="context" name="logEnv" value="${log.env}" />-->
    <property scope="context" resource="log.properties" />
    <!--<property scope="context" name="log.file.path" value="/usr/local/logs" />-->
    <!--<property scope="context" name="smtp.enable" value="true" />-->
    <!--<property scope="context" name="smtp.host" value="smtp.126.com" />-->
    <!--<property scope="context" name="smtp.port" value="25" />-->
    <!--<property scope="context" name="smtp.username" value="xxx@126.com" />-->
    <!--<property scope="context" name="smtp.password" value="xxx" />-->
    <!--<property scope="context" name="smtp.from" value="xxx@126.com" />-->
    <!--<property scope="context" name="smtp.to" value="xxx@126.com" />-->
    <!--<property scope="context" name="max.history" value="30" />-->
    <!--<property scope="context" name="file.html.size" value="512MB" />-->
    <!--<property scope="context" name="file.html.enable" value="true" />-->
    
    <!-- 多应用区分 -->
    <!--<timestamp key="byDay" datePattern="yyyyMMdd" timeReference="contextBirth" />-->
    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) %magenta([%thread]) %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- <appender name="EVENT_LOG_STDOUT" class="org.eclipse.virgo.medic.log.logback.ReroutingAwareConsoleAppender">
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
		</encoder>
	</appender> -->
    
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.file.path}/query.log</file>
        <append>true</append>
        <!-- set immediateFlush to false for much higher logging throughput -->
        <immediateFlush>true</immediateFlush>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${log.file.path}/query.%d{yyyy-MM-dd}.log.gz</fileNamePattern>

            <!-- keep 30 days' worth of history capped at 3GB total size -->
            <maxHistory>${max.history:-30}</maxHistory>
            <!--<totalSizeCap>3GB</totalSizeCap>-->

        </rollingPolicy>

        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- <appender name="EVENT_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>serviceability/eventlogs/eventlog.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
			<FileNamePattern>serviceability/eventlogs/eventlog_%i.log</FileNamePattern>
			<MinIndex>1</MinIndex>
			<MaxIndex>13</MaxIndex>
		</rollingPolicy>
		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<MaxFileSize>10MB</MaxFileSize>
		</triggeringPolicy>
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-28.28thread &lt;%X{medic.eventCode}&gt; %msg %ex%n</Pattern>
		</encoder>
	</appender> -->
    
    <appender name="HTML_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${log.file.path}/query.jsp</file>
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
                <expression>
                    ${file.html.enable} =~ /true/
                </expression>
            </evaluator>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${log.file.path}/query.%d{yyyy-MM-dd}.%i.html</fileNamePattern>
            <maxFileSize>${file.html.size:-512MB}</maxFileSize>
            <maxHistory>1</maxHistory>
            <totalSizeCap>${file.html.size:-512MB}</totalSizeCap>
        </rollingPolicy>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg</pattern>
            </layout>
        </encoder>
    </appender>
    
    <!-- <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>serviceability/logs/log.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
			<FileNamePattern>serviceability/logs/log_%i.log</FileNamePattern>
			<MinIndex>1</MinIndex>
			<MaxIndex>13</MaxIndex>
		</rollingPolicy>
		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<MaxFileSize>10MB</MaxFileSize>
		</triggeringPolicy>
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
		</encoder>
	</appender> -->
	
	 <!--discriminator鉴别器,根据taskId这个key对应的value鉴别日志事件,然后委托给具体appender写日志-->
	
    <!-- <appender name="SIFTED_LOG_FILE" class="ch.qos.logback.classic.sift.SiftingAppender">
		<discriminator>
			<Key>applicationName</Key>
			<DefaultValue>virgo-server</DefaultValue>
		</discriminator>
		<sift>
			<appender name="${applicationName}_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
				<file>serviceability/logs/${applicationName}/log.log</file>
				<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
					<FileNamePattern>serviceability/logs/${applicationName}/log_%i.log</FileNamePattern>
					<MinIndex>1</MinIndex>
					<MaxIndex>13</MaxIndex>
				</rollingPolicy>
				<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
					<MaxFileSize>10MB</MaxFileSize>
				</triggeringPolicy>
				<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
					<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %-28.28thread %-64.64logger{64} %X{medic.eventCode} %msg %ex%n</Pattern>
				</encoder>
			</appender>
		</sift>
	</appender> -->
    
    <!-- marker email send -->
    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <!-- event描述信息 -->
        <discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator">
            <key>host</key>
            <defaultValue>none</defaultValue>
        </discriminator>
        <!-- email  -->
        <smtpHost>${smtp.host}</smtpHost>
        <smtpPort>${smtp.port}</smtpPort>
        <username>${smtp.username}</username>
        <password>${smtp.password}</password>
        <to>${smtp.to}</to>
        <from>${smtp.from}</from>
        <subject>【ERROR】: %logger{0} from %X{host}</subject>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date %-5level %logger{35} - %message%n</pattern>
        </layout>
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
                <expression>
                    ${smtp.enable} =~ /true/
                </expression>
            </evaluator>
            <OnMismatch>DENY</OnMismatch>
            <OnMatch>ACCEPT</OnMatch>
        </filter>
        <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
            <marker>NOTIFY</marker>
            <!-- you specify add as many markers as you want -->
            <!--<marker>TRANSACTION_FAILURE</marker>-->
        </evaluator>
        <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
            <!-- send just one log entry per email -->
            <bufferSize>1</bufferSize>
        </cyclicBufferTracker>
    </appender>
    
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.file.path}/query-error.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${log.file.path}/query-error.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <maxHistory>${max.history:-30}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <logger name="com.qding" level="${log.level:-info}">
        <appender-ref ref="ERROR" />
    </logger>

    <root level="${log.level:-info}">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
        <appender-ref ref="HTML_FILE" />
        <appender-ref ref="EMAIL" />
    </root>
    <!--<if condition='p("logEnv").contains("dev")'>-->
        <!--<then>-->
            <!--<root level="info">-->
                <!--<appender-ref ref="STDOUT" />-->
            <!--</root>-->
        <!--</then>-->
        <!--<else>-->
            <!--<root level="debug">-->
                <!--<appender-ref ref="STDOUT" />-->
            <!--</root>-->
        <!--</else>-->
    <!--</if>-->
    
    <!-- <logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.localized">
		<appender-ref ref="EVENT_LOG_STDOUT" />
		<appender-ref ref="EVENT_LOG_FILE" />
	</logger>
	
	<logger level="INFO" additivity="false" name="org.eclipse.virgo.medic.eventlog.default">
		<appender-ref ref="SIFTED_LOG_FILE" />
		<appender-ref ref="LOG_FILE" />
	</logger>

	<root level="INFO">
		<appender-ref ref="SIFTED_LOG_FILE" />
		<appender-ref ref="LOG_FILE" /> -->
	</root>   
</configuration>

23.SpringSession

MIT License Copyright (c) 2020 李昊哲 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

springboot demo 展开 收起
Java
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/tangcco/springboot.git
git@gitee.com:tangcco/springboot.git
tangcco
springboot
springboot
master

搜索帮助