域名弄好了网站怎么建设,做期货都看那些网站,中小互联网企业有哪些,wordpress有没有翻书的主题原创作者#xff1a;田超凡#xff08;程序员田宝宝#xff09;
版权所有#xff0c;引用请注明原作者#xff0c;严禁复制转载
整合配置文件
1.在springboot整合配置文件#xff0c;分成两大类#xff1a;
application.properties
application.yml
或者是
Boots…原创作者田超凡程序员田宝宝
版权所有引用请注明原作者严禁复制转载
整合配置文件
1.在springboot整合配置文件分成两大类
application.properties
application.yml
或者是
Bootstrap.properties
Bootstrap.yml
相对于来说yml文件格式写法更加精简减少配置文件的冗余性。 2.加载顺序
bootstrap.yml 先加载 application.yml后加载
bootstrap.yml 用于应用程序上下文的引导阶段。
bootstrap.yml 由父Spring ApplicationContext加载。
区别
bootstrap.yml 和 application.yml 都可以用来配置参数。
bootstrap.yml 用来程序引导时执行应用于更加早期配置信息读取。可以理解成系统级别的一些参数配置这些参数一般是不会变动的。一旦bootStrap.yml 被加载则内容不会被覆盖。
application.yml 可以用来定义应用级别 应用程序特有配置信息可以用来配置后续各个模块中需使用的公共参数等。
分布式配置中心 Properties在线转换yml格式网址https://www.toyaml.com/index.html
7.1使用value注解 Value(${tcf.name})private String name; 7.2ConfigurationProperties !--导入配置文件处理器配置文件进行绑定就会有提示--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/dependency import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;
ComponentConfigurationProperties(prefix tcf)public class TcfUserEntity {private String addres;private String age;private String name;public String getAddres() {return addres;}public String getAge() {return age;}public String getName() {return name;}public void setAddres(String addres) {this.addres addres;}public void setAge(String age) {this.age age;}public void setName(String name) {this.name name;}Overridepublic String toString() {return TcfUserEntity{ addres addres \ , age age \ , name name \ };}} tcf:addres: www.tcf.comage: 22name: tcf Autowiredprivate TcfUserEntity tcfUserEntity; RequestMapping(/getNameAndAgeAddres)public String getNameAndAgeAddres() {return tcfUserEntity.toString();} 7.3配置文件占位符
在SpringBoot的配置文件中我们可以使用SpringBoot提供的的一些随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
-${app.name:默认值} 来制定找不到属性时的默认值 7.4多环境配置 spring:profiles:active: pre application-dev.yml开发环境 application-test.yml测试环境 application-prd.yml生产环境
7.5、核心配置
server:port: 8081servlet:context-path: /tcf Springboot 默认的情况下整合tomcat容器 日志管理
8.1.使用logback记录日志 Springboot 已经默认帮你整合好了logback
日志输出文件在当前项目路径log文件夹下
Maven依赖 dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency
Logback配置 configuration!--本文主要输出日志为控制台日志系统日志sql日志异常日志--!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, --!--控制台--appender nameconsole classch.qos.logback.core.ConsoleAppenderencoderpattern%d %p (%file:%line\)- %m%n/patterncharsetUTF-8/charset/encoder/appender!--系统info级别日志--!--File 日志目录没有会自动创建--!--rollingPolicy日志策略每天建立一个日志文件或者当天日志文件超过64MB时--!--encoder 日志编码及输出格式--appender namefileLogclassch.qos.logback.core.rolling.RollingFileAppenderFilelog/file/fileLog.log/FilerollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePatternlog/file/fileLog.log.%d.%i/fileNamePatterntimeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP!-- or whenever the file size reaches 64 MB --maxFileSize64 MB/maxFileSize/timeBasedFileNamingAndTriggeringPolicy/rollingPolicyencoderpattern
%d %p (%file:%line\)- %m%n/patterncharsetUTF-8/charset!-- 此处设置字符集 --/encoder/appender!--sql日志--appender namesqlFileclassch.qos.logback.core.rolling.RollingFileAppenderFilelog/sql/sqlFile.log/FilerollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePatternlog/sql/sqlFile.log.%d.%i/fileNamePatterntimeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP!-- or whenever the file size reaches 64 MB --maxFileSize64 MB/maxFileSize/timeBasedFileNamingAndTriggeringPolicy/rollingPolicy!--对记录事件进行格式化。负责两件事一是把日志信息转换成字节数组二是把字节数组写入到输出流。--encoder!--用来设置日志的输入格式--pattern
%d %p (%file:%line\)- %m%n/patterncharsetUTF-8/charset!-- 此处设置字符集 --/encoder/appender!--异常日志--appender nameerrorFileclassch.qos.logback.core.rolling.RollingFileAppenderFilelog/error/errorFile.log/FilerollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePatternlog/error/errorFile.%d.log.%i/fileNamePatterntimeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP!-- or whenever the file size reaches 64 MB --maxFileSize64 MB/maxFileSize/timeBasedFileNamingAndTriggeringPolicy/rollingPolicy!--对记录事件进行格式化。负责两件事一是把日志信息转换成字节数组二是把字节数组写入到输出流。--encoder!--用来设置日志的输入格式--pattern
%d %p (%file:%line\)- %m%n/patterncharsetUTF-8/charset!-- 此处设置字符集 --/encoder!--日志都在这里 过滤出 error使用 try {}catch (Exception e){} 的话异常无法写入日志可以在catch里用logger.error()方法手动写入日志--filter classch.qos.logback.classic.filter.LevelFilterlevelERROR/levelonMatchACCEPT/onMatchonMismatchDENY/onMismatch/filter/appender!-- 日志输出级别 --!--All\DEBUG\INFO\WARN\ERROR\FATAL\OFF--!--打印info级别日志分别在控制台fileLogerrorFile输出异常日志在上面由过滤器过滤出ERROR日志打印--root levelINFOappender-ref reffileLog /appender-ref refconsole /appender-ref referrorFile //root!--打印sql至sqlFile文件日志--logger namecom.dolphin.mapper levelDEBUG additivityfalseappender-ref refconsole /appender-ref refsqlFile //logger/configuration application ###指定读取logback配置文件logging:config: classpath:log/logback.xml
测试案例 RestControllerSlf4jpublic class MyIndexService { RequestMapping(/getName)public String getName(String name, int age) {log.info(name:{},age:{}, name, age);return name;} } 日志级别
ALL 最低等级的用于打开所有日志记录。
TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12很低的日志级别一般不会使用。
DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的主要用于开发过程中打印一些运行信息。
INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息这个可以用于生产环境中输出程序运行的一些重要信息但是不能滥用避免打印过多的日志。
WARN 表明会出现潜在错误的情形有些信息不是错误信息但是也要给程序员的一些提示
ERROR 指出虽然发生错误事件但仍然不影响系统的继续运行。打印错误和异常信息如果不想输出太多的日志可以使用这个级别。
FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误这种级别你可以直接停止程序了。
OFF 最高等级的用于关闭所有日志记录。 日志目录 8.2.使用log4j记录日志
日志级别
机制如果一条日志信息的级别大于等于配置文件的级别就记录。 trace追踪就是程序推进一下可以写个trace输出
debug调试一般作为最低级别trace基本不用。
info输出重要的信息使用较多
warn警告有些信息不是错误信息但也要给程序员一些提示。
error错误信息。用的也很多。
fatal致命错误。
输出源
CONSOLE输出到控制台
FILE输出到文件
格式
SimpleLayout以简单的形式显示
HTMLLayout以HTML表格显示
PatternLayout自定义形式显示
8.2.1新建log4j配置文件
文件名称log4j.properties #log4j.rootLoggerCONSOLE,info,error,DEBUGlog4j.rootLoggerDEBUG,error,CONSOLE,infolog4j.appender.CONSOLEorg.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layoutorg.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n log4j.logger.infoinfolog4j.appender.infoorg.apache.log4j.DailyRollingFileAppenderlog4j.appender.info.layoutorg.apache.log4j.PatternLayout log4j.appender.info.layout.ConversionPattern%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n log4j.appender.info.datePattern.yyyy-MM-ddlog4j.appender.info.Threshold info log4j.appender.info.appendtruelog4j.appender.info.FileE:/code/log/info.loglog4j.logger.errorerror log4j.appender.errororg.apache.log4j.DailyRollingFileAppenderlog4j.appender.error.layoutorg.apache.log4j.PatternLayout log4j.appender.error.layout.ConversionPattern%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n log4j.appender.error.datePattern.yyyy-MM-ddlog4j.appender.error.Threshold error log4j.appender.error.appendtruelog4j.appender.error.FileE:/code/log/error.loglog4j.logger.DEBUGDEBUGlog4j.appender.DEBUGorg.apache.log4j.DailyRollingFileAppenderlog4j.appender.DEBUG.layoutorg.apache.log4j.PatternLayout log4j.appender.DEBUG.layout.ConversionPattern%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n log4j.appender.DEBUG.datePattern.yyyy-MM-ddlog4j.appender.DEBUG.Threshold DEBUG log4j.appender.DEBUG.appendtruelog4j.appender.DEBUG.FileE:/code/log/dubug.log log4j代码 private static final Logger logger LoggerFactory.getLogger(IndexController.class); 8.2.2.Maven依赖 dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!-- spring boot start --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdexclusions!-- 排除自带的logback依赖 --exclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-logging/artifactId/exclusion/exclusions/dependency!-- springboot-log4j --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-log4j/artifactIdversion1.3.8.RELEASE/version/dependency
8.2.3.application ###指定log4j.properties配置文件路径logging:config: classpath:log4j.properties 8.3.使用AOP统一处理Web请求日志
基于AOP实现 或者elk
在我们的方法的前后实现拦截 减少打印日志代码的冗余性的问题
8.3.1 POM文件新增依赖 dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-aop/artifactId /dependency 6.3.2 AOP切面相关配置 Aspect Component public class WebLogAspect { private static final Logger logger LoggerFactory.getLogger(WebLogAspect.class); Pointcut(execution(public * com.tcf.controller.*.*(..))) public void webLog() { } Before(webLog()) public void doBefore(JoinPoint joinPoint) throws Throwable { // 接收到请求记录请求内容 ServletRequestAttributes attributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request attributes.getRequest(); // 记录下请求内容 logger.info(URL : request.getRequestURL().toString()); logger.info(HTTP_METHOD : request.getMethod()); logger.info(IP : request.getRemoteAddr()); EnumerationString enu request.getParameterNames(); while (enu.hasMoreElements()) { String name (String) enu.nextElement(); logger.info(name:{},value:{}, name, request.getParameter(name)); } } AfterReturning(returning ret, pointcut webLog()) public void doAfterReturning(Object ret) throws Throwable { // 处理完请求返回内容 logger.info(RESPONSE : ret); } }
其他内容
9.1、使用Scheduled创建定时任务
在Spring Boot的主类中加入EnableScheduling注解启用定时任务的配置
Component
public class ScheduledTasks { private static final SimpleDateFormat dateFormat new SimpleDateFormat(HH:mm:ss); Scheduled(fixedRate 5000) public void reportCurrentTime() { System.out.println(现在时间 dateFormat.format(new Date())); }
} Scheduled(cron 0/2 * * * * *) 写法
quartz/Cron/Crontab表达式在线生成工具-BeJSON.com
Xxl-job 9.2、使用Async实现异步调用
启动加上EnableAsync ,需要执行异步方法上加入 Async
异步应用场景
Async实际就是多线程封装的
异步线程执行方法有可能会非常消耗cpu的资源所以大的项目建议使用
Mq异步实现。
整合线程池 import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.task.TaskExecutor;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;ConfigurationEnableAsyncpublic class ThreadPoolConfig {/*** 每秒需要多少个线程处理?* tasks/(1/taskcost)*/private int corePoolSize 3;/*** 线程池维护线程的最大数量* (max(tasks)- queueCapacity)/(1/taskcost)*/private int maxPoolSize 3;/*** 缓存队列* (coreSizePool/taskcost)*responsetime*/private int queueCapacity 10;/*** 允许的空闲时间* 默认为60*/private int keepAlive 100;Beanpublic TaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();// 设置核心线程数executor.setCorePoolSize(corePoolSize);// 设置最大线程数executor.setMaxPoolSize(maxPoolSize);// 设置队列容量executor.setQueueCapacity(queueCapacity);// 设置允许的空闲时间秒//executor.setKeepAliveSeconds(keepAlive);// 设置默认线程名称executor.setThreadNamePrefix(thread-);// 设置拒绝策略rejection-policy当pool已经达到max size的时候如何处理新任务// CALLER_RUNS不在新线程中执行任务而是有调用者所在的线程来执行executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 等待所有任务结束后再关闭线程池executor.setWaitForTasksToCompleteOnShutdown(true);return executor;}} import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Component;
Slf4jComponentpublic class MemberServiceAsync {Async(taskExecutor)public String smsAsync() {log.info(02);try {log.info(正在发送短信..);Thread.sleep(3000);} catch (Exception e) {}log.info(03);return 短信发送完成!;}}
异步注解配置类 import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.task.TaskExecutor;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;ConfigurationEnableAsyncpublic class ThreadPoolConfig {/*** 每秒需要多少个线程处理?* tasks/(1/taskcost)*/private int corePoolSize 3;/*** 线程池维护线程的最大数量* (max(tasks)- queueCapacity)/(1/taskcost)*/private int maxPoolSize 3;/*** 缓存队列* (coreSizePool/taskcost)*responsetime*/private int queueCapacity 10;/*** 允许的空闲时间* 默认为60*/private int keepAlive 100;Beanpublic TaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();// 设置核心线程数executor.setCorePoolSize(corePoolSize);// 设置最大线程数executor.setMaxPoolSize(maxPoolSize);// 设置队列容量executor.setQueueCapacity(queueCapacity);// 设置允许的空闲时间秒//executor.setKeepAliveSeconds(keepAlive);// 设置默认线程名称executor.setThreadNamePrefix(thread-);// 设置拒绝策略rejection-policy当pool已经达到max size的时候如何处理新任务// CALLER_RUNS不在新线程中执行任务而是有调用者所在的线程来执行executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 等待所有任务结束后再关闭线程池executor.setWaitForTasksToCompleteOnShutdown(true);return executor;}} 注意失效问题
注意如果异步注解写当前自己类有可能aop会失效无法拦截注解最终导致异步注解失效需要经过代理类调用接口
所以需要将异步的代码单独抽取成一个类调用接口。
9.3全局捕获异常
ExceptionHandler 表示拦截异常
ControllerAdvice 是 controller 的一个辅助类最常用的就是作为全局异常处理的切面类ControllerAdvice 可以指定扫描范围ControllerAdvice 约定了几种可行的返回值如果是直接返回 model 类的话需要使用 ResponseBody 进行 json 转换 返回 String表示跳到某个 view返回 modelAndView返回 model ResponseBody ControllerAdvicepublic class TcfExceptionHandler {/*** 拦截运行异常出现的错误~~~** return*/ExceptionHandler(RuntimeException.class)ResponseBodypublic MapObject, Object exceptionHandler() {MapObject, Object map new HashMap();map.put(error, 500);map.put(msg, 系统出现错误~);return map;}}
9.4发布打包
使用mvn package 打包
使用java –jar 包名
如果报错没有主清单,在pom文件中新增 buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdexecutionsexecutiongoalsgoalrepackage/goal/goals/execution/executionsconfigurationmainClasscom.tcf.App/mainClassexcludesexcludegroupIdjunit/groupIdartifactIdjunit/artifactId/excludeexcludegroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/exclude/excludes/configuration/plugin/plugins/build
本文部分素材转载自蚂蚁课堂