【转】Spring Boot 构建应用——快速构建 Spring Boot 应用
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 应用的更多相关文章
- 用 Spring Boot 和 MybatisPlus 快速构建项目
自动生成 public class MPGenerator { public static void main(String[] args) { AutoGenerator autoGenerator ...
- 使用 Spring Boot 快速构建 Spring 框架应用--转
原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/ Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2 ...
- 使用Spring Boot快速构建应用
http://www.infoq.com/cn/news/2014/01/spring-boot/ 随着Spring 4新版本的发布,Spring Boot这个新的子项目得到了广泛的关注,因为不管是S ...
- 使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer
Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...
- Springboot(一):使用Intellij中的Spring Initializr来快速构建Spring Boot工程
使用Intellij中的Spring Initializr来快速构建Spring Boot工程 New---Project 可以看到图所示的创建功能窗口.其中Initial Service Url指向 ...
- 只需两步!Eclipse+Maven快速构建第一个Spring Boot项目
随着使用Spring进行开发的个人和企业越来越多,Spring从一个单一简介的框架变成了一个大而全的开源软件,最直观的变化就是Spring需要引入的配置也越来越多.配置繁琐,容易出错,让人无比头疼, ...
- Spring Boot 基于Spring Initializer 的快速构建 day02
一.基于Spring Initializr 快速构建Spring Boot项目(快速) 备注:需要联网 这是使用Intellij Idea快速构建可以为我们省去大量的pom.xml配置时间,简单操作, ...
- 使用 Spring Boot 快速构建 Spring 框架应用
Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...
- Spring Boot中使用Swagger2构建强大的RESTful API文档
由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...
随机推荐
- Python内置函数之-property
property 是一个内置的装饰器函数,只在面向对象中使用 求一个圆的周长和面积 # 周长和面积都是通过类的方法得到from math import pi class Cricle: def __i ...
- ansible的plugins
callback插件:路径 /usr/lib/python2.7/site-packages/ansible/plugins 回显输出型(stdout): stderr.py skippy.py se ...
- xstream实现对象的序列化和反序列化(Java)
概述 最新整理Java方面XML序列化和反序列化的常用工具类,找到了dom4j和xstream.dom4j相对小巧,很好的解读xml:但是对于对象的xml序列化和反序列化,我还是比较喜欢xsteam( ...
- 动态dp
题解: 首先这类题目本身是一个dp/树形dp 然后带上了修改(ddp) 为了权衡查询和修改的时间,我们采用树剖来维护 假设我们能够对每个点维护除了重儿子之外的信息 那么我们的修改只需要修改log个节点 ...
- Tomcat目录结构详解
1.bin: 该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat6.exe.tomcat6w.exe,前者是在控制台下启动Tomcat,后者是弹出UGI窗口 ...
- DDoS攻击与防御(4)
在发生DDoS攻击的情况下,可以通过一些缓解技术来减少攻击对自身业务和服务的影响,从而在一定程度上保障业务正常运行.缓解DDoS攻击的主要方法是对网络流量先进行稀释再进行清洗. 1.攻击流量的稀释 1 ...
- 移动端1px边框实现
问题描述:移动端iPhone上的1px边框看起来像2px那么粗.问题分析:不同的手机有不同的像素密度,在window对象中有一个devicePixelRatio属性,它可以反应设备的像素与css中的像 ...
- SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)
一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config ...
- 今天圆满了----tensorflow安装日志
Ubuntu的安装 不能用easyBCD,因为新电脑是UEFI启动模式,制作了Ubuntu的系统盘,强烈建议只分swap区(2G)和根目录/区,之前因为/home区不够导致重装 建议使用官方安装文档, ...
- Fiddler 教程---小坦克
协议. Fiddler无论对开发人员或者测试人员来说,都是非常有用的工具 Fiddler的工作原理 Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1, 端口:888 ...