SpringBoot学习笔记2
九:创建父工程
注意:打包方式选择为pom
将创建SpringBoot常用的依赖和插件放在父工程的pom.xml,如下:
<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.wu</groupId>
<artifactId>SpringBoot_Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <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>
</plugins>
</build>
</project>
pom.xml
9.1建立子工程
点击Next,
9.2在子工程的pom.xml中引入相应的依赖
<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>
<parent>
<groupId>com.wu</groupId>
<artifactId>SpringBoot_Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>SpringBoot_Child1</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
子工程的pom.xml
9.3:SpringBoot整合测试
首选需要添加测试相关依赖
<!-- 测试相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
测试相关依赖
编写需要测试的controller类
package com.wu.controller; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
@EnableAutoConfiguration
public class SpringController {
@ResponseBody
public String yes(){ return "yes";
} //程序启动入口
public static void main(String []args){
SpringApplication.run(SpringController.class, args);
}
}
SpringController .java
编写测试类
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration; import com.wu.controller.SpringController; import junit.framework.TestCase; @SpringBootTest(classes=SpringController.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration//和Web整合
public class TestSpringController {
@Autowired
private SpringController springController; @Test
public void test1(){
TestCase.assertEquals(this.springController.yes(),"yes");
}
}
TestSpringController
十:设置专门的启动类
目的:
将程序启动入口单独放入一个类中
方法1:使用@EnableAutoConfiguration,和@ComponentScan("要扫描的包的路径")默认扫描是当前包和当前包的子包
注意:原本加在Controller类的@EnableAutoConfiguration放在启动类上,Controller类上只需要添加@Controller
package com.wu.app; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan; import com.wu.controller.SpringController; @EnableAutoConfiguration
@ComponentScan("com.wu.controller")//默认扫描的是当前包和当前包的子包
public class SpringApplications {
//程序启动入口
public static void main(String []args){
SpringApplication.run(SpringApplications.class, args);
}
}
启动类
方法2:在启动类上只使用一个注解@SpringBootApplication
package com.wu.app; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan; import com.wu.controller.SpringController; //@EnableAutoConfiguration
//@ComponentScan("com.wu.controller")//默认扫描的是当前包和当前包的子包
@SpringBootApplication(scanBasePackages={"com.wu.controller"})
public class SpringApplications {
//程序启动入口
public static void main(String []args){
SpringApplication.run(SpringApplications.class, args);
}
}
只设置@SpringBootApplication
十一:@RestController的使用(该注解类中整合了@ResponseBody,@Controller)
* Copyright 2002-2016 the original author or authors. package org.springframework.web.bind.annotation; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import org.springframework.stereotype.Controller; /**
* A convenience annotation that is itself annotated with
* {@link Controller @Controller} and {@link ResponseBody @ResponseBody}.
* <p>
* Types that carry this annotation are treated as controllers where
* {@link RequestMapping @RequestMapping} methods assume
* {@link ResponseBody @ResponseBody} semantics by default.
*
* <p><b>NOTE:</b> {@code @RestController} is processed if an appropriate
* {@code HandlerMapping}-{@code HandlerAdapter} pair is configured such as the
* {@code RequestMappingHandlerMapping}-{@code RequestMappingHandlerAdapter}
* pair which are the default in the MVC Java config and the MVC namespace.
* In particular {@code @RestController} is not supported with the
* {@code DefaultAnnotationHandlerMapping}-{@code AnnotationMethodHandlerAdapter}
* pair both of which are also deprecated.
*
* @author Rossen Stoyanchev
* @author Sam Brannen
* @since 4.0
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController { /**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any
* @since 4.0.1
*/
String value() default ""; }
@RestController
目的:
当Controller类的方法需要向页面传递数据时,会在方法前加@ResponseBody, 如果在每个方法前都加,可能有些麻烦,因此,可以在类上直接加@RestController,之后该类中的每个方法的return,都会向页面返回数据
示例:
package com.wu.controller; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; @RestController
public class SpringController {
//@ResponseBody
@RequestMapping("/yes")
public String yes(){ return "yes";
} @RequestMapping("/show/{id}")
public String showId(@PathVariable String id){
return "show"+id; } }
使用@RestController的Controller类
十二:SpringBoot日志管理
12.1默认:
不用再单独配置日志依赖,SpringBoot使用的默认日志框架是Logback,默认使用ERROR,WARN,INFO级别的日志输出到控制台
12.2日志具体信息:
日志时间:精确到毫秒 日志级别:TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF 进程ID - - - {线程名} Logger名:通常是类名 :日志类容
12.3在全局配置文件application.properties中配置日志级别
示例:
#让日志输出warn及以上级别的输出
logging.level.root=WARN #让该类输出DEBUG及以上的日志信息
logging.level.org.springframework.web=DEBUG
在application.properties中配置日志级别
12.4将日志信息同时写入到日志文件中
同样需要在全局配置文件中配置相关日志文件的路径
示例:
#让日志输出warn及以上级别的输出
logging.level.root=WARN #让该类输出DEBUG及以上的日志信息
logging.level.org.springframework.web=DEBUG #配置日志文件方式一
#logging.file=D:\\BaiduNetdiskDownload\\SpringBoot\\logs\\info.log #配置日志文件方式二
logging.path=D:\\BaiduNetdiskDownload\\SpringBoot\\logs
配置日志文件
注意:路径可以是绝对路径,也可以是相对路径,两种配置日志文件的方式任选其一,但是如果俩个都配置,会执行logging.file
12.5配置相关日志格式
整体配置如下:
#让日志输出warn及以上级别的输出
logging.level.root=WARN #让该类输出DEBUG及以上的日志信息
logging.level.org.springframework.web=DEBUG #配置日志文件方式一
logging.file=D:\\BaiduNetdiskDownload\\SpringBoot\\logs\\info.log #配置日志文件方式二
#logging.path=D:\\BaiduNetdiskDownload\\SpringBoot\\logs #配置输出到控制台的格式
logging.pattern.console=%d{yyyy-MM-dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n #配置输出到日志文件的格式
logging.pattern.file=%d{yyyy-MM-dd-HH:mm} [%thread] %-5level %logger- %msg%n
SpringBoot日志简单配置
12.6自定义日志配置文件
SpringBoot官方推荐优先带有“-spring"的作为日志配置,如使用logback-spring.xml,而不是logback.xml,名命为logback-spring.xml的日志配置文件,SpringBoot可以为其配置一些spring boot特有的配置项,如果想自己命名日志文件,可以在全局配置文件中加入logging.config=classpath:logging.config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。 当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName> <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
<property name="log.path" value="D:/BaiduNetdiskDownload/SpringBoot/logs" /> <!--0. 日志格式和颜色渲染 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr"
converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" /> <!--1. 输出到控制台 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此过滤器是将debug级别以下的日志过滤掉,此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender> <!--2. 输出到文档 -->
<!-- 2.1 level为 DEBUG 日志,时间滚动输出 -->
<appender name="DEBUG_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/web_debug.log</file>
<!--日志文档输出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%n</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${log.path}/web-debug-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数 -->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文档只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender> <!-- 2.2 level为 INFO 日志,时间滚动输出 -->
<appender name="INFO_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/web_info.log</file>
<!--日志文档输出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/web-info-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数 -->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文档只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender> <!-- 2.3 level为 WARN 日志,时间滚动输出 -->
<appender name="WARN_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/web_warn.log</file>
<!--日志文档输出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/web-warn-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数 -->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文档只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender> <!-- 2.4 level为 ERROR 日志,时间滚动输出 -->
<appender name="ERROR_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/web_error.log</file>
<!--日志文档输出格式 -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/web-error-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数 -->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文档只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 level:用来设置打印级别,大小写无关:TRACE,
DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 不能设置为INHERITED或者同义词NULL。默认是DEBUG 可以包含零个或多个元素,标识这个appender将会添加到这个logger。 -->
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root> <!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性,
一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE,
DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别。 addtivity:是否向上级logger传递打印信息。默认是true。 -->
<!-- 该包下的类将日志信息传递给上级,即root,然后跟着root打印日志到控制台和日志文件中 -->
<logger name="com.wu.controller" level="info" /> <!-- 此种设置是将该类产生的日志信息不传递到上级,而是单独将WARN以上的日志信息输出到控制台 -->
<logger name="com.wu.controller.SpringController" level="WARN"
addtivity="false">
<appender-ref ref="CONSOLE" />
</logger> <!-- 多环境下的日志输出 --> <!--开发环境:打印控制台 -->
<springProfile name="dev">
<logger name="com.wu.controller" level="debug" />
</springProfile> <!--生产环境:输出到文档并打印到控制台 <springProfile name="pro"> <root level="info"> <appender-ref
ref="CONSOLE" /> <appender-ref ref="DEBUG_FILE" /> <appender-ref ref="INFO_FILE"
/> <appender-ref ref="ERROR_FILE" /> <appender-ref ref="WARN_FILE" /> </root>
</springProfile> --> </configuration>
logback-spring.xml
测试:
package com.wu.controller; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; @RestController
public class SpringController { private Logger logger=LoggerFactory.getLogger(this.getClass()); //@ResponseBody
@RequestMapping("/yes")
public String yes(){
logger.debug("debug信息");
//由于在 <logger/>中配置了只打印WARN级别以上的信息,因此应该会只输出"error信息"
logger.error("error信息");
return "yes";
}
}
需要打印日志信息的Controller类
结果:
12.7不同环境下的日志输出
在原先的自定义日志配置文件中已经添加了
<springProfile name="dev">
<logger name="com.wu.controller" level="debug" />
</springProfile>
<springProfile>标签的属性name可以设置不同的开发环境名
注意:需要在全局配置文件application.properties中添加所需要的环境,如:
spring.profiles.active=
在application.properties中添加需要的日志环境
12.8使用log4j 进行日志管理
1,在pom.xml中添加如下:
<!-- log4j -->
<!-- 排除自带的logback日志框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加log4j相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
SpringBoot中使用log4j
2,在src/main/resource下创建log4j.properties,具体如下:
#log4j.rootLogger=CONSOLE,info,error,DEBUG
log4j.rootLogger=info,error,CONSOLE,DEBUG log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.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-dd
log4j.appender.info.Threshold = info
log4j.appender.info.append=true
#日志输出文件位置
log4j.appender.info.File=D:/BaiduNetdiskDownload/SpringBoot/logs/api_services_info.log log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.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-dd
log4j.appender.error.Threshold = error
log4j.appender.error.append=true
#log4j.appender.error.File=/home/admin/pms-api-services/logs/error/api_services_error
log4j.appender.error.File=D:/BaiduNetdiskDownload/SpringBoot/logs/api_services_error.log log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.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-dd
log4j.appender.DEBUG.Threshold = DEBUG
log4j.appender.DEBUG.append=true
#log4j.appender.DEBUG.File=/home/admin/pms-api-services/logs/debug/api_services_debug
log4j.appender.DEBUG.File=D:/BaiduNetdiskDownload/SpringBoot/logs/api_services_debug.log ### Debug
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.properties
3, 测试
package com.wu.controller; import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class TestController {
private Logger logger=Logger.getLogger(TestController.class); @RequestMapping("/yes")
public String yes(){
logger.debug("这是debug日志");
logger.info("这是info日志");
logger.error("这是error日志");
return "yes";
}
}
简单测试的Controller类
十三 将工程设置为开发模式(代码修改后,不用重新运行)
只需要在pom.xml中加入以下依赖:
<!-- 加入以下两个依赖,代码作了修改,不用重新运行 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
所需依赖
十四 SpringBoot的web开发
14.1 前提
如前面一样,加入以下依赖,即给我自动配置tomcat和springmvc等的配置(在spring-boot-autoconfigure.jar/org.springframework.boot.autoconfigure.web下)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
14. 2InternalResourceViewResolver(视图解析器)
注意: 自己需要在application.properties中配置前缀和后缀,如下:
spring.mvc.view.prefix=
spring.mvc.view.suffix=
在application.properties中配置前后缀
14.3静态资源访问
SpringBoot默认从 /classpath/static/ 或 /classpath/public/ 或 /META-INF/resources/ 下获取css和js
示例:
启动后访问 localhost:8080/wjs.jpg
要点:可以在application.properties中自定义静态文件(js,css,images)路径,如在全局配置文件中加入
spring.resources.static-locations=
注意: 自定义静态资源路径后,原本默认的路径将失效!
十五:消息转换器
参考资料1,资料2
15.1,SpringBoot中已经默认配置了消息转换器,如需要自定义,可以参考以上资料
15.2,使用FastJson解析Json数据(默认使用的是JacksonHttpMessageConverters)
导入相关依赖:
<!-- FastJson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
fastjson依赖
15.2.1 配置fastjson方式一:
启动类 extends WebMvcConfigurerAdapter 并重写 configureMessageConverters方法,如下:
package com.wu.app; import java.util.List; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; @SpringBootApplication(scanBasePackages={"com.wu.controller"})
public class SpringApplications extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//创建FastJson消息转换器
FastJsonHttpMessageConverter converter=new FastJsonHttpMessageConverter();
//创建FastJson配置对象
FastJsonConfig config=new FastJsonConfig();
//对json数据进行格式化
config.setSerializerFeatures(SerializerFeature.PrettyFormat);
//装载配置
converter.setFastJsonConfig(config);
//装载转换器
converters.add(converter);
} //程序启动入口
public static void main(String []args){
SpringApplication.run(SpringApplications.class, args);
}
}
在启动类中配置FastJson转换器
测试: 创建实体类,如下
package com.wu.pojo; import java.util.Date; public class Person {
private String name;
private String date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
} }
Person.java
创建Controller类将person类json化并返回给页面,如下:
package com.wu.controller; import java.text.SimpleDateFormat;
import java.util.Date; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.wu.pojo.Person; @RestController
public class PersonController {
@RequestMapping("/person")
public Object showPerson(){
Person person=new Person();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd:HH-mm-ss");
person.setName("夏明");
person.setDate(format.format(new Date()));
return person;
}
}
PersonController.java
启动,结果为:
发现有乱码
将springboot的response编码设置为utf-8的设置开启(默认为false),在全局配置文件中加入:
spring.http.encoding.force=true
即回复正常:
也可以在Person类的Date date 字段上添加日期格式化,如:
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date date;
15.2.2 配置fastjson方式二:
通过@Bean 将fastjson转换器注入到Spring容器中
也是在启动类中配置,具体如下:
package com.wu.app; import java.util.List; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; @SpringBootApplication(scanBasePackages={"com.wu.controller"})
public class SpringApplications {
@Bean
public HttpMessageConverters fastJsonMessageConverter(){
//创建FastJson消息转换器
FastJsonHttpMessageConverter converter=new FastJsonHttpMessageConverter();
//创建FastJson配置对象
FastJsonConfig config=new FastJsonConfig();
//对json数据进行格式化
config.setSerializerFeatures(SerializerFeature.PrettyFormat);
//装载配置
converter.setFastJsonConfig(config);
HttpMessageConverter<?> con=converter;
return new HttpMessageConverters(con);
} //程序启动入口
public static void main(String []args){
SpringApplication.run(SpringApplications.class, args);
}
}
在启动类中通过@Bean将fastJson转换器注入到Spring容器中
启动测试依然正常
SpringBoot学习笔记2的更多相关文章
- SpringBoot学习笔记
SpringBoot个人感觉比SpringMVC还要好用的一个框架,很多注解配置可以非常灵活的在代码中运用起来: springBoot学习笔记: .一.aop: 新建一个类HttpAspect,类上添 ...
- Springboot学习笔记(六)-配置化注入
前言 前面写过一个Springboot学习笔记(一)-线程池的简化及使用,发现有个缺陷,打个比方,我这个线程池写在一个公用服务中,各项参数都定死了,现在有两个服务要调用它,一个服务的线程数通常很多,而 ...
- SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用
SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用 Spring Boot Admin是一个管理和监控Spring Boot应用程序的应用程序.本文参考文档: 官 ...
- SpringBoot学习笔记(3):静态资源处理
SpringBoot学习笔记(3):静态资源处理 在web开发中,静态资源的访问是必不可少的,如:Html.图片.js.css 等资源的访问. Spring Boot 对静态资源访问提供了很好的支持, ...
- SpringBoot学习笔记(2):引入Spring Security
SpringBoot学习笔记(2):用Spring Security来保护你的应用 快速开始 本指南将引导您完成使用受Spring Security保护的资源创建简单Web应用程序的过程. 参考资料: ...
- SpringBoot学习笔记(7):Druid使用心得
SpringBoot学习笔记(7):Druid使用心得 快速开始 添加依赖 <dependency> <groupId>com.alibaba</groupId> ...
- SpringBoot学习笔记(4):与前端交互的日期格式
SpringBoot学习笔记(4):与前端交互的日期格式 后端模型Date字段解析String 我们从前端传回来表单的数据,当涉及时间.日期等值时,后端的模型需将其转换为对应的Date类型等. 我们可 ...
- SpringBoot学习笔记(4):添加自定义的过滤器
SpringBoot:学习笔记(4)——添加自定义的过滤器 引入自定义过滤器 SpringBoot提供的前端控制器无法满足我们产品的需求时,我们需要添加自定义的过滤器. SpringBoot添加过滤器 ...
- SpringBoot学习笔记(13):日志框架
SpringBoot学习笔记(13):日志框架——SL4J 快速开始 说明 SpringBoot底层选用SLF4J和LogBack日志框架. SLF4J的使用 SpringBoot的底层依赖关系 1. ...
- SpringBoot学习笔记(12):计划任务
SpringBoot学习笔记(12):计划任务 计划任务 在企业的实践生产中,可能需要使用一些定时任务,如月末.季末和年末需要统计各种各样的报表,每周自动备份数据等. 在Spring中使用定时任务 1 ...
随机推荐
- autotools工具使用 good
学习GNU/LINUX开发的编程人员,上手之后不久就会在编译开源软件的时候碰到configure脚本,过段时间还会知道configure脚本是 autoconf生成的:但是真正想用起来autoconf ...
- 使用WebBrowser并调用网页中的JS函数
在界面上拖入QAxWidget,注意这里不建议直接在UI设计界面指定控件,否则可能引起QtCreator崩溃 建议在代码中动态设置,如: ui->axWidget->setControl( ...
- Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)
模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口.非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框. 如果从线程角度来讲,模态对话 ...
- 用CMake 构建Qt 项目
译:用CMake构建Qt项目作者: Johan Thelin 译者:赖敬文原链接:http://developer.qt.nokia.com/quarterly/view/using_cmake_t ...
- 你真的懂printf么?
自从你进入程序员的世界,就开始照着书本编写着各种helloworld,大笔一挥: printf("Hello World!\n"); 于是控制台神奇地出现了一行字符串,计算机一句温 ...
- Hadoop集群(第6期)JDK和SSH无密码配置
1.Linux配置java环境变量 1.1 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录,执行命令 ./jdk-6u14-linux-i586.bi ...
- 深入理解ES6 - var-let-const
知识点 var 声明变量: 1.存在变量提升,实际上var无论在哪里声明,都会被当做当前的作用域顶部声明变量. 2.可以重复声明,后声明的变量会覆盖前声明的变量. let 声明变量: 1.不存在变量提 ...
- CentOS 7 时间同步方法
centos 7 时间同步使用的是chrony工具 1.检测chrony包是否安装 [root@martin ~]# rpm -qa|grep chrony 2.安装chrony [root@mart ...
- You can't specify target table 'tbl_students' for update in FROM clause错误
此问题只出现在mysql中 oracle中无此问题 在同一语句中,当你在select某表的数据后,不能update这个表,如: DELETE FROM tbl_students WHERE id NO ...
- javascript“命名空间”的费曼输出[原创]
Javascript由于没有命名空间的概念,所以好多的框架或库就用了某些“命名空间”的技巧.在学习作为函数的命名空间时,我翻阅了好多的书本和blog,很多的概念和说明都是要么过于烦杂或过于简单.现在由 ...