随着动态语言的流行(Ruby、Groovy、Scala、Node.js),Java 的开发运行格外的笨重:繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。
在上述环境下,SpringBoot应运而生。它使用"习惯优于配置"(项目中存在大量的配置, 此外还内置一个习惯性的配置,让你无须手动进行配置)的理念让你的项目快速运行起来。使用SpringBoot很容易创建一个独立运行(运行jar,内联Servlet容器)、准生产级别的基于Spring框架的项目,使用 SpringBoot你可以不用或者只需要很少的 Spring配置。
点击file->new->project,选择Spring Initializr然后点击下一步,如果失败,则选择Custom,填入阿里初始化地址 https://start.aliyun.com/。
填写项目信息,GroupId一般分为多个段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。ArtifactId表示你这个项目的名称,然后点击next。
选择项目的依赖,也可以后续在pom文件中添加(这里我选择了spring web 和 mybatis的依赖),点击下一步,选择项目位置,点击完成,我们的项目就搭建好了。
SpringBoot通常有一个名为xxApplication的入口类,入口类里有一个main方法,这个main 方法其实就是一个标准的Java 应用的入口方法。在main方法中使用 SpringApplication.run(BasisApplication.class, args),启动SpringBoot应用项目。
@SpringBootApplication是SpringBoot的核心注解,它是一个组合注解,源码如下:
如果不使用@SpringBootApplication,则可以在入口类上面直接使用@EnableAutoConfiguration、@Configuration、@ComponentScan
根据@SpringBootApplication源码我们可知,关闭特定的自动配置可以使用@SpringBootApplication的exclude参数。
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(BasisApplication.class);
springApplication.setBannerMode(Banner.Mode.OFF);
springApplication.run(args);
}
SpringBoot使用一个全局的配置文件application.properties或application.yml,放置在 sre/main/resources目录或者类路径的/config下。
SpringBoot不仅支持常规的properties配置文件,还支持yaml语言的配置文件。yaml是以数据为中心的语言,在配罝数据的时候具有面向对象的特征。SpringBoot的全局配置文件的作用是对一些默认配置的配置值进行修改。简单配置如下:
server:
port: 8080
servlet:
context-path: /basis
SpringBoot可以是基于jar包运行的,打成jar包的程序可以直接通过下面命令运行(修改端口为9090):
java -jar xx.jar --server.port=9090
组合使用,可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。
#persion配置类
persion.name=张三
persion.age=12
@Component
@PropertySource(value = "classpath:config/persion.properties", ignoreResourceNotFound = true, encoding = "utf-8")
public class PersonPropertis {
@Value("${persion.name}")
private String name;
@Value("${persion.age}")
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "PersonPropertis{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
一般和@PropertySource组合使用,否则读取默认配置文件(application.properties),可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。
#student配置类
student.name=张三
student.age=12
@Component
@PropertySource(value = "classpath:student.properties", ignoreResourceNotFound = true, encoding = "utf-8")
@ConfigurationProperties(prefix = "student")
public class StudentPropertis {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "StudentPropertis{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
//用法2(推荐)
@Configuration
@PropertySource(value = "classpath:config/student.properties", ignoreResourceNotFound = true, encoding = "utf-8")
public class StudentConfig {
@Bean
@ConfigurationProperties(prefix = "student")
public StudentPropertis studentPropertis(){
return new StudentPropertis();
}
}
默认情况下,SpringBoot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序时,可以看到很多INFO级别的日志了。
默认日志输出内容元素具体如下:
# 日志配置
logging:
# 日志级别
level:
root: info
file:
# 日志文件名格式
name: ./logs/${spring.application.name}.log
pattern:
# 一般使用默认格式就行,无需配置
# 日志记录格式[组件名称] [时间戳] [日志级别] [类名.方法名] [消息文本]
file: "%d{yyyy-MM-dd HH:mm:ss.SSS} %p %C.%M %m %n"
logback:
rollingpolicy:
# 根据文件大小归档,超过2KB自动归档,次日启动服务时也会自动归档
file-name-pattern: ./logs/%d{yyyyMMdd}/${spring.application.name}.%d{yyyy-MM-dd}_%i.log.gz
# 最大日志文件大小(默认为10MB,这里为了测试归档,暂时设置为2KB,具体视情况修改)
max-file-size: 2KB
# 要保留的日志备份的总大小(默认为0B)
total-size-cap: 1GB
# 保存存档日志文件的最大天数(默认为7天)
max-history: 20
# application-dev.yml日志配置
log:
# 日志级别
level:
root: info
com:
fengfan:
basis: debug
file:
path: ./log
maxHistory: 20
maxFileSize: 2KB
totalSizeCap: 1GB
pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} %p %C.%M %m %n"
<configuration debug="false">
<springProperty scope="context" name="LOG_HOME" source="log.file.path" defaultValue="./log"/>
<springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="basis"/>
<springProperty scope="context" name="ROOT_LEVEL" source="log.level.root" defaultValue="INFO"/>
<springProperty scope="context" name="BASIS_LEVEL" source="log.level.com.fengfan.basis" defaultValue="DEBUG"/>
<springProperty scope="context" name="PATTERN" source="log.file.pattern" defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} - [%X{traceID}] - [%thread] %-5level %logger{50}.%M\(%line\) - %msg%n"/>
<springProperty scope="context" name="MAXHISTORY" source="log.file.maxHistory" defaultValue="30"/>
<springProperty scope="context" name="MAXFILESIZE" source="log.file.maxFileSize" defaultValue="100MB"/>
<springProperty scope="context" name="TOTALSIZECAP" source="log.file.totalSizeCap" defaultValue="10GB"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${PATTERN}pattern>
encoder>
appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/${APP_NAME}.%d{yyyy-MM-dd}_%i.log.gzfileNamePattern>
<maxHistory>${MAXHISTORY}maxHistory>
<maxFileSize>${MAXFILESIZE}maxFileSize>
<totalSizeCap>${TOTALSIZECAP}totalSizeCap>
rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${PATTERN}pattern>
encoder>
appender>
<logger name="com.apache.ibatis"/>
<logger name="java.sql.Connection"/>
<logger name="java.sql.Statement"/>
<logger name="java.sql.PreparedStatement"/>
<springProfile name="dev">
<root level="${ROOT_LEVEL}">
<appender-ref ref="FILE"/>
<appender-ref ref="STDOUT"/>
root>
<logger name="com.fengfan.basis" level="${CN_LEVEL}"/>
springProfile>
<root level="${ROOT_LEVEL}">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
root>
<logger name="com.fengfan.basis" level="${CN_LEVEL}"/>
configuration>
具体使用请参见logback官网https://logback.qos.ch/
Spring对不同环境,提供不同配置功能的支持,可以通过激活、指定参数等方式快速的切换环境,环境就是平常的开发环境、测试环境、生产环境等。
spring:
application:
name: basis
profiles:
active: dev
SpringBoot提倡零配置,即无xml配置,但是在实际项目中,可能有一些特殊要求你必须使用xml配置,这时我们可以通过Spring提供的@ImportResource来加载xml配置,如下:
@ImportResource("classpath:config/spring.xml")