工欲善其事必先利其器,SpringBoot应用开发推荐两款开发工具
1. STS(Spring Tool Suit) 是Spring官方推荐的工具,在Eclipse的基础上提供了开发SpringBoot的插件,下载地址为:https://spring.io/tools
2. Idea,这是一个传说中最好用的收费的开发工具,也提供了对SpringBoot的支持。下载地址:https://www.jetbrains.com/idea/
项目搭建
这里选择使用STS来搭建SpringBoot应用,因为SpringBoot就是为了简化Spring繁琐的配置而诞生的,因此新建一个SpringBoot项目非常简单,通过STS提供的插件,直接在新建项目时选择Spring Starter Project就可以了。
Step 1 : 创建新项目
File--> New--> Spring Starter Project
Step 2: 指定坐标
Service URL 这个参数不用关心,使用默认值就可以了。
name 是项目的名字,最终会显示到项目的结构中,一般和后面的Artifact的值保持一致。
group 指定的是maven坐标中的groupId的值。
Artifact 指定的是maven坐标中artifactId的值。
version 指定是项目的版本。
description 指定项目的描述信息。
package 指定的是项目的基础包名。 SpringBoot项目创建完毕之后,会自动创建一个NameApplication的类,这个类就会放到这个package指定的包下,作为整个项目的最顶层的包。
Step 3: 选择依赖
这里就是选择Maven的依赖,SpringBoot项目和传统的Maven项目一样,都可以直接修改pom文件来管理依赖,因为SpringBoot依赖都比较长,开发者可能不太便于记忆,因此提供了一个图形化界面来选择依赖,比如要开发Web应用,选择Web就可以了;要使用Mybatis选择Mybatis的依赖就好。这样在创建项目的时候,就会自动把这些依赖引入到pom中。
点击finish之后,如果是第一次使用,这个过程会比较漫长,因为需要下载所依赖的jar包,耐心等待即可。如果要加快下载速度,可以进行一些Maven项目的配置,具体可以参考《maven下载构件慢》 这篇文章。
最后的目录结构如下
application.properties 配置文件就是Spring Boot的核心配置文件,在这里可以进行配置,默认为空,没有任何配置,这也正是SpringBoot所提倡的,习惯优于配置。当然,后面还需要对具体的内容进行配置,比如要使用的Web容器,再或者指定容器的的端口号等等。
Step 4: 创建Controller
到这里,SpringBoot的项目就创建成功了,下面来创建一个Controller类,并使用RequestMapping进行映射。
package com.example.demo.controller;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
@RequestMapping("/")
public void index(HttpServletResponse response) {
try {
response.getWriter().write("Hello World");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Step 5:启动
任何一个Spring Boot项目都有一个 可以运行的程序。以Application结尾,如上例的DemoApplication。打开这个程序,以java或者以spring Boot的方式就可以运行。
启动日志如下:
Step 6: 浏览器访问
看到Tomcat启动在了8080端口。下面访问 localhost:8080 看浏览器的显示。
配置服务器和端口号
默认给我们使用了Tomcat作为Web容器,默认开启了8080端口,爷看着不爽,想用80端口,怎么办?
你只需要在application.properties中加入下面一句就可以了
server.port=80
我不想用Tomcat,我想用jetty,怎么办?你要用jetty,那首先要引入jetty的依赖吧
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
有了jetty的包,总要把Tomcat的包去掉吧,啥,你说你没引入Tomcat的包,那怎么可能呢,只是它隐藏起来了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
可以了,把Tomcat给揪出来了,下面启动使用的就是Jetty了。
到这里,最简单的Web应用就搭建起来了,但这个Web应用仅具备Web请求与响应,并没有连接数据库,也没有缓存支持,不能记录日志,也不支持消息队列......有时间一个一个整合!
整合Mybatis
---慢慢补上,要上班了....
整合Redis
SpringBoot的核心思想是0配置、0配置、0配置!!! 因此你在传统Spring项目中配置Redis的那一套全不用,全都不用!只需要在SpringBoot中引入SpringBoot-Redis的依赖,就可以使用了!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
测试代码
package com.example.demo;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class RedisController {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@RequestMapping("/set")
public void setKey(String key, String value, HttpServletResponse res) throws Exception {
redisTemplate.opsForValue().set(key, value);
res.getWriter().println("Set Success");
}
}
Spring中提供的操作Redis的类是RedisTemplate,不需要任何的配置,直接注入就可以使用。
Redis支持的各种数据类型,可以通过RedisTemplate的opsForXxx方法获取,比如string类型,就可以通过上面的opsForValue方法获取。
浏览器测试
当客户端访问/set这个路径时,就会把传入的key和value保存到redis中,如下
Redis中查看查看,数据已经保存到Redis中了。
Redis配置
虽说SpringBoot的核心是0配置,只是说对于繁琐的冗余的配置都不需要了,但有些关键内容还是要进行配置的,比如你要连接到哪台Redis,Redis开放的端口是多少,Redis的密码等等信息。当然,这些都是有默认值的,不满足默认值你就需要自己去配置了。
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
第一条是指定Redis服务器的地址
第二条是指定Redis服务器的端口
第三条是指定Redis服务器的密码
第四条是指定要连接的Redis库(0-15)
还有一堆的关于Redis连接池的配置,这里就不说了,有需要的自己在网络上搜下就可以了。
使用Redis做方法级别缓存
经常有这样的需求,为了提高性能,某些方法级别需要增加缓存。方法级别的缓存可以直接通过注解支持,非常方便。
先看代码
@RequestMapping("/")
@ResponseBody
public String index(String name) {
// 进行复杂的计算
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
}
return "Hello " + name;
}
这段代码非常简单,就是请求根路径的时候,传入名字,并输出 Hello Name给客户端。中间会有一个非常耗时的计算,且只要name值相同,计算出的结果都是一样的。每次请求都要等待5s这样用户体验非常不好,且浪费系统资源。
我们希望当第一次访问这个方法传入 风清扬 时,需要等待5s后,客户端接收到响应,第二次再请求同样的名字时,可以立刻得到结果。
实现步骤
(1)开启缓存支持 增加 @EnableCaching 这个注解在配置类中
@EnableCaching
@SpringBootApplication
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
}
(2)指定@CacheConfig 和 @Cacheable
package com.example.demo;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@CacheConfig(cacheNames = "redis:controller")
public class RedisController {
@RequestMapping("/")
@Cacheable(key = "#name")
@ResponseBody
public String index(String name) {
// 进行复杂的计算
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
}
return "Hello " + name;
}
}
再次测试的时候,我们就会发现,只要是名字相同的,都可以非常快速的响应,不需要每次都等待5s了。