Spring Boot 简化了 Spring 应用开发,不需要配置就能运行 Spring 应用,Spring Boot 的自动配置是通过 Spring 4.x 的条件注解 @Conditional 来实现的,@Conditional 根据特定条件来控制 bean 的创建行为。Spring Boot 默认会使用内置的 Tomcat,并支持 Spring MVC、RESTful 服务。新建 Spring Boot 项目很简单,IntelliJ IDEA 在 New Project 中选择 Spring Initializr,然后组件选择 Web (集成 Spring MVC 框架) 即可创建成功。Spring Boot 通过 Starter 来提供系统级服务,Spring Boot 已经提供了一系列的 Starter,下表是 Spring Boot 提供的常用 Starter:

名称 作用
spring-boot-starter-web Web开发支持,默认使用Tomcat8
spring-boot-starter-aop AOP开发支持,使用AspectJ
spring-boot-starter-test 包含JUnit、Spring Test、Hamcrest、Mockito等测试工具
spring-boot-starter-jdbc Spring JDBC
spring-boot-starter-cache 缓存,支持多种缓存方式,如本地的、Redis、Ehcache等
spring-boot-starter-activemq 消息集成ActiveMQ支持
spring-boot-starter-amqp 消息集成AMQP协议支持,如支持RabbitMQ
spring-boot-starter-web-services webservice支持
spring-boot-starter-websocket websocket支持
spring-boot-starter-jersey REST应用和Jersey支持
spring-boot-starter-freemarker Freemarker模板引擎支持
spring-boot-starter-thymeleaf Thymeleaf模板引擎支持
spring-boot-starter-jta-atomikos 分布式事务支持,使用atomikos
spring-boot-starter-jta-bitronix 一个开源的分布式事务支持
spring-boot-starter-data-jpa JPA方式访问数据库,使用Hibernate作为JPA实现
spring-boot-starter-data-elasticsearch 集成Elasticsearch,默认访问localhost:9200
spring-boot-starter-data-redis 集成Redis,使用JRedis,默认连接localhost:6379
spring-boot-starter-data-mongodb 集成MongoDB,默认访问mongodb://localhost/test
spring-boot-starter-data-neo4j 集成neo4j,默认访问localhost:7474
spring-boot-starter-data-gemfire 集成分布式缓存
spring-boot-starter-data-solr 集成solr搜索平台,默认访问http://localhost:8983/solr
spring-boot-starter-data-cassandra 集成Cassandra,默认访问localhost:7474
spring-boot-starter-data-ldap 集成ldap
spring-boot-devtools 页面和代码的热部署,在修改类或者配置文件的时候自动重新加载Spring Boot应用

1.多环境配置

在 resources 下新建全局配置文件 application.properties、开发环境配置文件 application-dev.properties 和生产环境配置文件 application-prod.properties,application.properties 配置如下:

#使用开发环境
spring.profiles.active=dev
#自定义
example.str=hello

其中的 str 可以通过 @Value 获取值:

@Value("${example.str}")
private String str;

生产环境配置文件 application-dev.properties 配置如下:

server.port=8081
  • 1

2.Spring Boot配置类

Spring Boot 通过 @Configuration 注册 bean,例如:

@Configuration
public class HelloConfig {
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
}

3.开发Spring MVC应用

使用 Spring Boot 可以高效的开发 Spring MVC 应用,需要注意的是,MVC 和三层架构 (展现层 + 应用层 (Service层) + 数据访问层 (Dao层) ) 是两个不同的概念,MVC 只存在三层架构的展现层,M 是数据模型,V 是视图页面,C 是控制器。MVC 和核心思想是业务数据抽取与业务数据呈现相分离。

Spring Boot常用注解 释义
@RestController Spring4之后新加的注解,等同于@ResponseBody+@Controller
@RequestMapping url映射,value可以为数组,例如{“/hello”, “/hi”}
@GetMapping GET类型的url映射,还有@PostMapping、@PutMapping、@DeleteMapping
@PathVariable 获取url中的数据
@RequestParam 获取请求参数的值,required属性表示是否必传,defaultValue属性表示默认值
@RequestBody 用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如application/json或application/xml等。

新建 HelloController:

@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}

运行项目(mvn spring-boot:run 命令),浏览器访问 http://localhost:8081/hello,即可看到输出结果 “Hello, Spring Boot!”。Spring Boot其他常用注解如下:

Spring Boot常用注解 释义
@Component 通用注解,会被注册为bean组件、基于它的还有@Repository、@Service、@Controller
@Autowired 标注在构造方法、类的任何方法上,实现自动装配
@Resource 默认按名称装配,当找不到与名称匹配的bean才会按类型装配
@Lazy(true) 表示延迟初始化
@Import 导入配置类,并支持导入普通的java类,并将其声明成一个bean
@Transactional 标注在类或方法上,声明式事务注解。建议使用@Transactional(rollbackFor = Exception.class)
@Value 使用EL-Spring表达式注入字符、属性、内容等
@JsonSerialize jackson注解,标注在属性或者字段上,指定序列化方式
@JsonProperty(“name”) jackson注解,标注在VO对象的属性上,例如categoryName,返回json中将显示成name
@JsonIgnore jackson注解,标注在POJO对象的属性、方法上,转成json格式时忽略该属性或者方法

4.AOP统一处理请求日志

需要添加 spring-boot-starter-aop 依赖,创建 Aspect 文件即可通过 AOP 统一处理请求日志了:

@Aspect
@Component
public class HttpAspect {
private Logger logger = LoggerFactory.getLogger(getClass());
@Pointcut("execution(public * com.example.server.controller.ContentController.*(..))")
public void log() {
}
//方法执行之前
@Before("log()")
public void doBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); //url
HttpServletRequest request = attributes.getRequest();
logger.info("url={}", request.getRequestURL());
}
//方法执行之后
@After("log()")
public void doAfter() {
logger.info("doAfter");
}
@AfterReturning(returning = "object", pointcut = "log()")
public void doAfterReturning(Object object) {
logger.info("response={}", object);
}
}

5.Spring Boot多线程编程

Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用 ThreadPoolTaskExecutor 可实现一个基于线程池的 TaskExecutor。而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过 @EnableAsync 开启对异步任务的支持,并通过在实际执行的 Bean 的方法中使用 @ Async 注解来声明是一个异步任务,如果注解在类级别,则表示该类所有的方法都是异步方法。

@Configuration
@EnableAsync
public class TaskExecutorConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(25);
taskExecutor.initialize();
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}

然后声明 @Async 注解,即可并发执行:

@Service
public class AsyncTaskService {
@Async
public void executeAsyncTask(Integer i) {
System.out.println("执行异步任务1:" + i);
}
@Async
public void executeAsyncTask2(Integer i) {
System.out.println("执行异步任务2:" + i);
}
}

6.Spring Boot定时任务

通过在配置类注解 @EnableScheduling 来开启对计划任务的支持,然后在要执行的方法上注解 @Scheduled 声明这是一个计划任务,支持 cron、fixDelay、fixRate 等类型的计划任务。cron 表达式可以去 http://www.pppet.net/ 生成。配置类:

@Configuration
@EnableScheduling
public class TaskSchedulerConfiguration {
}

计划任务执行类:

@Service
public class ScheduledTaskService {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
System.out.println("每隔5秒执行1次:" + dateFormat.format(new Date()));
}
@Scheduled(cron = "0/10 * * * * ? ")
public void fixTimeExecution() {
System.out.println("在指定时间" + dateFormat.format(new Date()) + "执行");
}
}

运行 Spring Boot 项目,发现计划任务按照计划依次执行成功。

7.Spring Boot配置SSL

使用 jdk 中的 keytool 生成 keystore:

keytool -genkey -alias tomcat

这时我就生成了 .keystore 证书文件,将证书文件复制到项目的根目录,然后通过 application.properties 中的 server.ssl.* 前缀配置 SSL 属性即可:

server.ssl.key-store=.keystore
server.ssl.key-password=123456
server.ssl.key-store-type=JKS
server.ssl.key-alias=tomcat

8.Spring Boot加载静态资源

静态资源(css、icon、iconfont、images、img、js)放在 resources/static 下,Freemaker 模版页面放在 resources/templates 下。我们将Freemaker 模版页面 index.ftl 放入到 resources/templates 下,编写一个 Controller 测试一下:

@Controller
public class IndexController {
@RequestMapping(value = "index", method = RequestMethod.GET)
public String showIndex() {
return "index";
}
}

运行访问,发现已经可以访问了。替换 favicon 只需要将自己的 favicon.ico 放置在 resources/static 下即可。除了这些,Spring Boot 还可以加载 WebJars,WebJars 将浏览器资源(css,js等)打成 jar 文件,以对资源进行统一依赖管理,例如添加 bootstrap:

<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>3.3.7-1</version>
</dependency>

页面引入就可以正常使用了:

<script type="text/javascript" src="/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js"></script>

9.Spring Boot单元测试

1.Service单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class ContentServiceTest {
@Resource
private ContentService contentService;
@Test
public void whenGetContentListSuccess() throws Exception {
Assert.assertNotEquals(0, contentService.getContentList().size());
}
}

2.Controller单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class ContentControllerTest {
@Resource
private ContentController contentController;
private MockMvc mvc;
private Logger logger = LoggerFactory.getLogger(ContentControllerTest.class);
@Before
public void setup() {
mvc = MockMvcBuilders.standaloneSetup(contentController).build();
}
@Test
public void whenGetContentListSuccess() throws Exception {
MvcResult result = mvc.perform(MockMvcRequestBuilders.get("/content/query/list")
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn();
logger.info(result.getResponse().getContentAsString());
}
}

Maven 打包跳过单元测试:

mvn clean package -Dmaven.test.skip=true

10.Spring Boot Logback日志配置

Spring Boot 默认使用 SLF4j 和 Logback 输出日志。增加 Logback 配置 resources/logback-spring.xml 即可完成日志文件的生成:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="false">
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender> <!-- 每天生成日志文件,并区分info和error日志输出 -->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>/var/log/tomcat/PROJECT_NAME/info.%d.log</fileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender> <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>/var/log/tomcat/PROJECT_NAME/error.%d.log</fileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender> <root level="info">
<appender-ref ref="consoleLog" />
<appender-ref ref="fileInfoLog" />
<appender-ref ref="fileErrorLog" />
</root>
</configuration>
  • spring boot项目发布

Spring Boot 内置了 tomcat-embed,所以可以直接通过 java -jar 的方式运行:

mvn clean package                               //打包
java -jar xx.jar --server.port=9090
java -jar xx.jar --spring.profiles.active=dev //可以通过java -jar配置参数指定配置文件 转载自:https://blog.csdn.net/smartbetter/article/details/53933096#

【转】Spring Boot 构建应用——快速构建 Spring Boot 应用的更多相关文章

  1. 用 Spring Boot 和 MybatisPlus 快速构建项目

    自动生成 public class MPGenerator { public static void main(String[] args) { AutoGenerator autoGenerator ...

  2. 使用 Spring Boot 快速构建 Spring 框架应用--转

    原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/ Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2 ...

  3. 使用Spring Boot快速构建应用

    http://www.infoq.com/cn/news/2014/01/spring-boot/ 随着Spring 4新版本的发布,Spring Boot这个新的子项目得到了广泛的关注,因为不管是S ...

  4. 使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer

    Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...

  5. Springboot(一):使用Intellij中的Spring Initializr来快速构建Spring Boot工程

    使用Intellij中的Spring Initializr来快速构建Spring Boot工程 New---Project 可以看到图所示的创建功能窗口.其中Initial Service Url指向 ...

  6. 只需两步!Eclipse+Maven快速构建第一个Spring Boot项目

     随着使用Spring进行开发的个人和企业越来越多,Spring从一个单一简介的框架变成了一个大而全的开源软件,最直观的变化就是Spring需要引入的配置也越来越多.配置繁琐,容易出错,让人无比头疼, ...

  7. Spring Boot 基于Spring Initializer 的快速构建 day02

    一.基于Spring Initializr 快速构建Spring Boot项目(快速) 备注:需要联网 这是使用Intellij Idea快速构建可以为我们省去大量的pom.xml配置时间,简单操作, ...

  8. 使用 Spring Boot 快速构建 Spring 框架应用

    Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...

  9. Spring Boot中使用Swagger2构建强大的RESTful API文档

    由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...

随机推荐

  1. 带问号的括号匹配问题918C 1153C

    cf里好像经常出 这些题,一般贪心是搞不了的.. 918C 问有多少子段[l,r]满足合法括号 先从左往右扫,如果问号+‘(' 数量 >= ')' 说明这段区间的 ) 是满足条件的 然后再从右往 ...

  2. 论文阅读笔记四十一:Very Deep Convolutional Networks For Large-Scale Image Recongnition(VGG ICLR2015)

    论文原址:https://arxiv.org/abs/1409.1556 代码原址:https://github.com/machrisaa/tensorflow-vgg 摘要 本文主要分析卷积网络的 ...

  3. mysql根据分组和条件查询以后如何统计记录的条数

    1.子查询,查询出的数据随便起一个别名,然后根据分组和条件查询出的数据,作为一个具有一列的一个表,然后外面的查询查询这个数据表的这一列的总数,即可. SELECT COUNT( * ) FROM ( ...

  4. 如何利用docker 构建golang线上部署环境

    公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...

  5. 关于hbase api的个人总结(带jar包)

    1.如果本机代码没问题,jar包没问题的话,检查集群也没用问题,但是代码运行显示 找不到对应的映射主机,需要在  C:\Windows\System32\drivers\etc  中修改host文件, ...

  6. java.net.NoRouteToHostException: No route to host解决方法

    当访问192.168.10.98上的tomcat时候,tomcat日志异常 然后查看tomcat服务器上的防火墙 查看service层的防火墙: 至此问题解决: 永久关闭防火墙: 1.首先查看防火墙状 ...

  7. Codeforces 461D. Appleman and Complicated Task 构造,计数

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF461D.html 题解 首先我们可以发现如果确定了第一行,那么方案就唯一了. 然后,我们来看看一个点的值确定 ...

  8. Java eclipse导入外部项目时出错怎么解决

    从外部环境import一个项目进入Java工作环境中,若出现以下错误,解决方法如下: 鼠标移上去,会出现以下错误提示: 解决方法: 选中该项目->右键->Build path->Co ...

  9. React十进制和二进制转换的实现和分析

    [描述] 模仿官方文档的摄氏度和华氏度的转换,实现十进制和二进制的互换. [实现] import React from 'react'; import ReactDOM from 'react-dom ...

  10. Codeforces --- 982C Cut 'em all! DFS加贪心

    题目链接: https://cn.vjudge.net/problem/1576783/origin 输入输出: ExamplesinputCopy42 44 13 1outputCopy1input ...