Springboot从实验到生产

(一) 背书

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

多年以来,Spring IO平台饱受非议的一点就是大量的XML配置以及复杂的依赖管理。在去年的SpringOne 2GX会议上,Pivotal的CTO Adrian Colyer回应了这些批评,并且特别提到该平台将来的目标之一就是实现免XML配置的开发体验。Boot所实现的功能超出了这个任务的描述,开发人员不仅不再需要编写XML,而且在一些场景中甚至不需要编写繁琐的import语句。在对外公开的beta版本刚刚发布之时,Boot描述了如何使用该框架在140个字符内实现可运行的web应用,从而获得了极大的关注度,该样例发表在tweet上。

然而,Spring Boot并不是要成为Spring IO平台里面众多“Foundation”层项目的替代者。Spring Boot的目标不在于为已解决的问题域提供新的解决方案,而是为平台带来另一种开发体验,从而简化对这些已有技术的使用。对于已经熟悉Spring生态系统的开发人员来说,Boot是一个很理想的选择,不过对于采用Spring技术的新人来说,Boot提供一种更简洁的方式来使用这些技术。

官方文档

(二) spring boot 初体验

搭建springboot 项目

  1. 2步操作
    • pom.xml 文档如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
  • 简单的class 文件:
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);
}
}

如你所看,以上两步,基本的springboot项目搭建完成
启动springboot
- 直接运行 Application
- mvn clean package –> java -jar demo-01-1.0-SNAPSHOT.jar
- mvn spring-boot:run

==注意== main 函数的定义,springboot 会自动扫描main函数 来启动
如果程序定义了多个main 函数。那么会启动失败,怎么解决呢?
指定启动的main-class

启动日志如下:

2017-11-22 14:16:03.128 INFO 1410 — [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-11-22 14:16:03.135 INFO 1410 — [ main] com.willian.springboot.Application : Started Application in 2.345 seconds (JVM running for 4.837)

说明启动成功,默认的端口号 8080 ,访问链接 http://localhost:8080

  1. 编写controller
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

@RequestMapping(value = "/")
public String index(){
return "hello world";
}
}

再次访问 http://localhost:8080

hello world

值得注意的,controller 所属的包必须 位于 Application 同级目录
否则无法扫描到你所定义的controller
3. 修改springboot 默认配置
springboot的启动端口号是默认的 8080, 我们可以通过 application.yml 文件配置自定义的端口号

server:
port: 8081

启动 访问 http://localhost:8081

  1. 配置拦截器
    在Application.java 中
@Configuration
static class WebMvcConfigurer extends WebMvcConfigurerAdapter {

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptorAdapter() {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
request.getContextPath();
logger.info("[==================拦截器==================]");
return true;
}
}).addPathPatterns("/*");
}
}

重启,再次访问: http://localhost:8081

  1. logback 文件配置

spring boot 默认使用 logback 来配置日志 ,引入 logback.xml 文件
配置信息如下

<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2010-2011 The myBatis Team
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<configuration>
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!--<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />-->

<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/Users/willian/data/logs/springboot-001/" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/springboot.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<!--<MaxHistory>30</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
&lt;!&ndash; 最大64MB 超过最大值,会重新建一个文件&ndash;&gt;
<maxFileSize>64 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>-->
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>-->
</appender>

<!--myibatis log configure-->
<logger name="org.springframework.web" level="INFO"/>
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>

<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<!--日志异步到数据库 -->
<!-- <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
&lt;!&ndash;日志异步到数据库 &ndash;&gt;
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
&lt;!&ndash;连接池 &ndash;&gt;
<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
<user>root</user>
<password>root</password>
</dataSource>
</connectionSource>
</appender>-->
</configuration>

重启,再次访问 http://localhost:8081 , 进入 /Users/willian/data/logs 即可看到log 内容。

logback 按天滚动日志,日志默认是记录在 以当前日期为后缀的文件中,而我们的线上的 log 脚本,默认读取的是 不带日期后缀的 log文件。 会造成读取不到。 等等问题

  1. log4j2 配置

修改 pom

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>logback-core</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>

新增 依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

log4j2 配置文件如下 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</Console>
<!-- 按日期每天生成log文件 -->
<RollingFile name="RollingFile" fileName="/Users/willian/data/logs/log4j2/springboot-01.log"
filePattern="/Users/willian/data/logs/log4j2/springboot-01.log-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="%d %p %C{1.} [%t] %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>

<!-- log文件只打印error级别信息 -->
<!-- <Filters>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>-->
</RollingFile>
</Appenders>
<Loggers>
<!-- 输出info级别信息 -->
<Root level="INFO">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>

(三) springboot 使用thymeleaf模板

1.引入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

在 resources 下创建 templates 目录,用于防止 html 页面,static 用于防止 静态资源文件,具体的使用参考 Spring Boot学习记录–thymeleaf模板

(四) springboot session 共享

  1. 引入依赖
<!--session 共享-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.1.RELEASE</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>jcl-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
  1. 配置yaml 文件
spring:
thymeleaf:
cache: false
redis:
sentinel:
nodes: sentinel1.position.mds.host:26379,sentinel2.position.mds.host:26379,sentinel3.position.mds.host:26379
master: mds-main-redis-shard02
database: 7
timeout: 5000
session:
store-type: redis

原文链接

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页