SpringBoot简介
SpringBoot特点
SpringBoot使用场景
Spring官方提供的项目骨架生成地址
http://start.spring.io/
https://spring.io/
代码编写
1.创建名为boot-start的maven项目pom文件如下
4.0.0
com.myimooc
boot-start
0.0.1-SNAPSHOT
jar
boot-start
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.0.1.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
true
org.springframework.boot
spring-boot-configuration-processor
org.springframework.boot
spring-boot-starter-freemarker
org.springframework.boot
spring-boot-starter-thymeleaf
mysql
mysql-connector-java
5.1.41
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
tk.mybatis
mapper-spring-boot-starter
1.2.4
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.3
org.mybatis.generator
mybatis-generator-core
1.3.2
compile
true
org.springframework.boot
spring-boot-starter-data-redis
org.apache.commons
commons-pool2
2.5.0
org.springframework.boot
spring-boot-starter-aop
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
2.编写BootStartApplication类
package com.myimooc.boot.start;
import org.n3r.idworker.Sid;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import tk.mybatis.spring.annotation.MapperScan;
/**
*
* 标题: 启动类
* 描述: 首个SpringBoot项目
* 使用 @EnableScheduling 开启支持定时任务
* 使用 @EnableAsync 开启异步执行程序
* @author zc
* @date 2018/04/19
*/
@SpringBootApplication
@MapperScan("com.myimooc.boot.start.dao.mapper")
@EnableScheduling
@EnableAsync
public class BootStartApplication {
public static void main(String[] args) {
SpringApplication.run(BootStartApplication.class, args);
}
@Bean
public Sid sid() {
return new Sid();
}
}
3.编写HelloController类
package com.myimooc.boot.start.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
* 标题: 基于REST的Controller
* 描述: 直接返回方法的响应内容
*
* @author zc
* @date 2018/04/19
*/
@RestController
public class HelloController {
@GetMapping("/hello")
public Object hello(){
return "Hello SpringBoot!";
}
}
然后启动BootStartApplication,访问http://localhost:8080/hello
spring Initializr方式生成SpringBoot工程
通常一个应用都会有一个统一的响应对象,用于封装响应状态、响应消息、响应数据等,并提供一些常用静态方法
代码编写
1.编写JsonResult类
package com.myimooc.boot.start.domain;
import java.io.Serializable;
/**
*
* 标题: 自定义JSON响应数据结构
* 描述: 统一请求响应返回的格式
* 200 成功
* 500 错误,错误信息在msg字段中
* 501 Bean验证错误信息,以map返回
* 502 拦截器拦截到用户token出错
* 555:抛出异常信息
* @author zc
* @date 2018/04/19
*/
public class JsonResult implements Serializable{
private static final long serialVersionUID = 4997293587553904193L;
/**
* 响应状态
*/
private Integer status;
/**
* 响应消息
*/
private String msg;
/**
* 响应数据
*/
private Object data;
public static JsonResult build(Integer status,String msg,Object data){
return new JsonResult(status,msg,data);
}
public static JsonResult ok(Object data){
return new JsonResult(200,"ok",data);
}
public static JsonResult ok(){
return JsonResult.ok(null);
}
public static JsonResult errMsg(String msg){
return new JsonResult(500,msg,null);
}
public static JsonResult errMap(Object data){
return new JsonResult(501,"error",data);
}
public static JsonResult errTokenMsg(String msg){
return new JsonResult(502,msg,null);
}
public static JsonResult errException(String msg){
return new JsonResult(555,msg,null);
}
public JsonResult() {
}
public JsonResult(Integer status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
@Override
public String toString() {
return "JsonResult{" +
"status=" + status +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
2.编写User类
package com.myimooc.boot.start.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
import java.util.Date;
/**
*
* 标题: POJO类
* 描述: 用户信息
*
* @author zc
* @date 2018/04/19
*/
public class User implements Serializable {
private static final long serialVersionUID = 7332961063564924222L;
/**
* 名称
*/
private String name;
/**
* 密码,使用 @JsonIgnore 注解,在序列化为 JSON 时,忽略该字段
*/
@JsonIgnore
private String password;
/**
* 年龄
*/
private Integer age;
/**
* 生日,使用 @JsonFormat 注解,在序列化为 JSON 时,使用 pattern 属性指定的值格式化日期时间
*/
@JsonFormat(pattern = "yyyy-MM-dd",locale = "zh",timezone = "GMT+8")
private Date birthday;
/**
* 描述,使用 @JsonInclude 注解,在序列化为 JSON 时,当字段为 null 时,则忽略该字段
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
private String note;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
", birthday=" + birthday +
", note='" + note + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
3.编写UserController类
package com.myimooc.boot.start.controller;
import com.myimooc.boot.start.domain.JsonResult;
import com.myimooc.boot.start.domain.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/**
*
* 标题: 使用Controller
* 描述: 返回JSON数据
*
* @author zc
* @date 2018/04/19
*/
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/getUser")
public User getUser(){
User user = new User();
user.setName("myImooc2");
user.setPassword("myImooc");
user.setAge(22);
user.setBirthday(new Date());
user.setNote("Hello");
return user;
}
@GetMapping("/getUserJson")
public JsonResult getUserJson(){
User user = new User();
user.setName("myImooc2");
user.setPassword("myImooc");
user.setAge(22);
user.setBirthday(new Date());
user.setNote("Hello");
return JsonResult.ok(user);
}
}
@JsonIgnore
private String password;
@JsonFormat(pattern="yyyy-MM-dd hh:mm:ss a", locale="zh", timezone="GMT+8")
private Date birthday;
@JsonInclude(Include.NON_NULL)
private String desc;
@JsonIgnore:忽略不显示给前端
@JsonFormat(pattern=“yyyy-MM-dd hh:mm:ss a”, locale=“zh”, timezone=“GMT+8”):日期显示格式
@JsonInclude(Include.NON_NULL):当数据为空时不会显示给前端
springboot使用devtools进行热部署
org.springframework.boot
spring-boot-devtools
true
application.properties热部署配置
#关闭缓存,即时刷新
#spring.freemarker.cache=false
#spring.thymeleaf.cache=false
#热部署生效
spring.devtools.restart.enabled=true
#设置重启的目录,添加那个目录的文件需要restart
spring.devtools.restart.additional-paths=src/main/java
#为mybatis设置,生产环境可删除
#restart.include.mapper=/mapper-[\\w-\\.]+jar
#restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar
#排除那个目录的文件不需要restart
spring.devtools.restart.exclude=static/**,public/**,WEB-INF/**
资源文件中的属性配置与映射到实体类
org.springframework.boot
spring-boot-configuration-processor
true
resource.properties配置文件
com.imooc.opensource.name=imooc
com.imooc.opensource.website=www.imooc.com
com.imooc.opensource.language=java
Resource.class
@Configuration //会引用资源文件
@ConfigurationProperties(prefix="com.imooc.opensource") //前缀
@PropertySource(value="classpath:resource.properties") //资源文件路径
public class Resource {
private String name;
private String website;
private String language;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWebsite() {
return website;
}
public void setWebsite(String website) {
this.website = website;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
}
@Configuration //会引用资源文件
@ConfigurationProperties(prefix=“com.imooc.opensource”) //前缀
@PropertySource(value=“classpath:resource.properties”) //资源文件路径
资源文件中配置tomcat相关属性
application.properties配置
############################################################
#
# Server 服务端相关配置
#
############################################################
#配置api端口号
#server.port=8088
#配置context-path,一般来说这个配置在正式发布的时候不配置
#server.context-path=/IMooc
#错误页,指定发生错误时,跳转的URL --> BasicErrorController
#server.error.path=/error
#session最大超时时间(分钟),默认为30分钟
server.session-timeout=60
#该服务绑定IP地址,启动服务器时如本机不是该IP地址则抛出异常启动失败
#只有特殊需求的情况下才配置,具体根据各自的业务来设置
#server.address=192.168.1.2
Server - tomcat 相关常用配置
############################################################
# Server - tomcat 相关常用配置
############################################################
#tomcat最大线程数,默认为200
#server.tomcat.max-threads=250
#tomcat的URI编码
server.tomcat.uri-encoding=UTF-8
#存放Tomcat的日志、Dump等文件的临时文件夹,默认为系统的tmp文件夹
#(如: C:\Users\Shanhy\AppData\Local\Temp)
#server.tomcat.basedir=H:/springboot-tomcat-tmp
#打开Tomcat的Access日志,并可以设置日志格式的方法:
#server.tomcat.access-log-enabled=true
#server.tomcat.access-log-pattern=
#accesslog目录,默认在basedir/logs
#server.tomcat.accesslog.directory=
#日志文件目录
#logging.path=H:/springboot-tomcat-tmp
#日志文件名称,默认为spring.log
#logging.file=myapp.log
org.springframework.boot
spring-boot-starter-freemarker
application.properties配置
############################################################
#
# freemarker 静态资源配置
#
############################################################
#设定ftl文件路径
spring.freemarker.template-loader-path=classpath:/templates
#关闭缓存,及时刷新,上线生产环境需要改为true
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
spring.freemarker.request-context-attribute=request
#后缀
spring.freemarker.suffix=.ftl
center.ftl
FreeMarker模板引擎
center page
index.ftl
FreeMarker模板引擎
${resource.name}
${resource.website}
${resource.language}
FreemarkerController
@Controller
@RequestMapping("ftl")
public class FreemarkerController {
@Autowired
private Resource resource;
@RequestMapping("/index")
public String index(ModelMap map) {
map.addAttribute("resource", resource);
return "freemarker/index";
}
@RequestMapping("center")
public String center() {
return "freemarker/center/center";
}
}
1.修改pom引入依赖
org.springframework.boot
spring-boot-starter-thymeleaf
2.修改application.properties
############################################################
#
# Thymeleaf 静态资源配置
#
############################################################
spring.thymeleaf.prefix=classpath:/templates/
# 关闭缓存,即时刷新,生产环境需改为true
spring.thymeleaf.cache=false
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
Thymeleaf模板引擎
hello world~~~~~~~
ThymeleafController.java
@Controller
@RequestMapping("th")
public class ThymeleafController {
@RequestMapping("/index")
public String index(ModelMap map) {
map.addAttribute("name", "thymeleaf-imooc");
return "thymeleaf/index";
}
@RequestMapping("center")
public String center() {
return "thymeleaf/center/center";
}
@RequestMapping("test")
public String test(ModelMap map) {
User u = new User();
u.setName("superadmin");
u.setAge(10);
u.setPassword("123465");
u.setBirthday(new Date());
u.setDesc("hello imooc");
map.addAttribute("user", u);
User u1 = new User();
u1.setAge(19);
u1.setName("imooc");
u1.setPassword("123456");
u1.setBirthday(new Date());
User u2 = new User();
u2.setAge(17);
u2.setName("LeeCX");
u2.setPassword("123456");
u2.setBirthday(new Date());
List userList = new ArrayList<>();
userList.add(u);
userList.add(u1);
userList.add(u2);
map.addAttribute("userList", userList);
return "thymeleaf/test";
}
@PostMapping("postform")
public String postform(User u) {
System.out.println("姓名:" + u.getName());
System.out.println("年龄:" + u.getAge());
return "redirect:/th/test";
}
@RequestMapping("showerror")
public String showerror(User u) {
int a = 1 / 0;
return "redirect:/th/test";
}
}
application.properties配置
############################################################
#
#配置i18n资源文件,供thymeleaf读取
#
############################################################
#路径
spring.messages.basename=i18n/messages
#缓存时间
spring.messages.cache-seconds=3600
spring.messages.encoding=UTF-8
############################################################
#
#用户自定义权限
#
############################################################
roles.manager=manager
roles.superadmin=superadmin
异常助手类:IMoocExceptionHandler.java
@ControllerAdvice
public class IMoocExceptionHandler {
public static final String IMOOC_ERROR_VIEW = "error";
// @ExceptionHandler(value = Exception.class)
// public Object errorHandler(HttpServletRequest reqest,
// HttpServletResponse response, Exception e) throws Exception {
//
// e.printStackTrace();
//
// ModelAndView mav = new ModelAndView();
// mav.addObject("exception", e);
// mav.addObject("url", reqest.getRequestURL());
// mav.setViewName(IMOOC_ERROR_VIEW);
// return mav;
// }
@ExceptionHandler(value = Exception.class)
public Object errorHandler(HttpServletRequest reqest,
HttpServletResponse response, Exception e) throws Exception {
e.printStackTrace();
if (isAjax(reqest)) {
return IMoocJSONResult.errorException(e.getMessage());
} else {
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", reqest.getRequestURL());
mav.setViewName(IMOOC_ERROR_VIEW);
return mav;
}
}
/**
*
* @Title: IMoocExceptionHandler.java
* @Package com.imooc.exception
* @Description: 判断是否是ajax请求
* Copyright: Copyright (c) 2017
* Company:FURUIBOKE.SCIENCE.AND.TECHNOLOGY
*
* @author leechenxiang
* @date 2017年12月3日 下午1:40:39
* @version V1.0
*/
public static boolean isAjax(HttpServletRequest httpRequest){
return (httpRequest.getHeader("X-Requested-With") != null
&& "XMLHttpRequest"
.equals( httpRequest.getHeader("X-Requested-With").toString()) );
}
}
捕获全局异常
发生错误:
1. pom.xml引入依赖
com.alibaba
druid
1.1.0
mysql
mysql-connector-java
5.1.41
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
tk.mybatis
mapper-spring-boot-starter
1.2.4
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.3
com.alibaba
druid-spring-boot-starter
1.1.9
org.mybatis.generator
mybatis-generator-core
1.3.2
compile
true
2. application.properties配置
############################################################
#
#配置数据源相关 使用阿里巴巴的druid数据源
#
############################################################
spring.datasource.url=jdbc:mysql://localhost:3306/leecx
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.initial-size=1
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=20
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.stat-view-servlet.allow=true
############################################################
#
# mybatis 配置
#
############################################################
# 定义 mybatis 的pojo类
mybatis.type-aliases-package=com.imooc.pojo
#定义mapper
mybatis.mapper-locations=classpath:mapper/*.xml
# 通用Mapper配置
mapper.mappers=com.imooc.utils.MyMapper
mapper.not-empty=false
mapper.identity=MYSQL
# 分页插件配置
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
3. generatorConfig.xml
4. 反编译方法GeneratorDisplay.java
public class GeneratorDisplay {
public void generator() throws Exception{
List warnings = new ArrayList();
boolean overwrite = true;
//指定 逆向工程配置文件
File configFile = new File("generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
public static void main(String[] args) throws Exception {
try {
GeneratorDisplay generatorSqlmap = new GeneratorDisplay();
generatorSqlmap.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. 右键执行GeneratorDisplay.java中的main即可生成mapper以及pojo
ImoocApplication.java添加
//扫描 mybatis mapper 包路径
@MapperScan(basePackages = "com.imooc.mapper")
sid:保证生成的id是唯一的
ImoocApplication.java中添加包扫描注解
//扫描 所有需要的包, 包含一些自用的工具类包 所在的路径
@ComponentScan(basePackages= {"com.imooc", "org.n3r.idworker"})
// 开始分页
PageHelper.startPage(page, pageSize);
//有事务就用已有事务,没事务就新建事务使用。经常用于增删改操作中
@Transactional(propagation = Propagation.REQUIRED)
//有事务就用已有事务,没事务就不用事务,经常用于查操作中
@Transactional(propagation = Propagation.SUPPORTS)
pom.xml中引入redis依赖
org.springframework.boot
spring-boot-starter-data-redis
application.properties配置
############################################################
#
# REDIS 配置
#
############################################################
# Redis数据库索引(默认为0)
spring.redis.database=1
# Redis服务器地址
spring.redis.host=192.168.1.191
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=1000
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=10
# 连接值中的最小空闲连接
spring.redis.pool.min-idle=2
# 连接超时时间(毫秒)
spring.redis.timeout=0
编写JsonUtils类
/**
*
* @Title: JsonUtils.java
* @Package com.lee.utils
* @Description: 自定义响应结构, 转换类
* Copyright: Copyright (c) 2016
* Company:Nathan.Lee.Salvatore
*
* @author leechenxiang
* @date 2016年4月29日 下午11:05:03
* @version V1.0
*/
public class JsonUtils {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 将对象转换成json字符串。
* Title: pojoToJson
* Description:
* @param data
* @return
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 将json结果集转化为对象
*
* @param jsonData json数据
* @return
*/
public static T jsonToPojo(String jsonData, Class beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将json数据转换成pojo对象list
* Title: jsonToList
* Description:
* @param jsonData
* @param beanType
* @return
*/
public static List jsonToList(String jsonData, Class beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
编写RedisOperator类
/**
*
* @Title: Redis 常用方法封装
* @Package com.itzixi.web.component
* @Description: 使用redisTemplate的操作实现类
*
* @author leechenxiang
* @date 2017年9月29日 下午2:25:03
* @version V1.0
*/
@Component
public class RedisOperator {
// @Autowired
// private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate redisTemplate;
// Key(键),简单的key-value操作
/**
* 实现命令:TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。
*
* @param key
* @return
*/
public long ttl(String key) {
return redisTemplate.getExpire(key);
}
/**
* 实现命令:expire 设置过期时间,单位秒
*
* @param key
* @return
*/
public void expire(String key, long timeout) {
redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}
/**
* 实现命令:INCR key,增加key一次
*
* @param key
* @return
*/
public long incr(String key, long delta) {
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 实现命令:KEYS pattern,查找所有符合给定模式 pattern的 key
*/
public Set keys(String pattern) {
return redisTemplate.keys(pattern);
}
/**
* 实现命令:DEL key,删除一个key
*
* @param key
*/
public void del(String key) {
redisTemplate.delete(key);
}
// String(字符串)
/**
* 实现命令:SET key value,设置一个key-value(将字符串值 value关联到 key)
*
* @param key
* @param value
*/
public void set(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
/**
* 实现命令:SET key value EX seconds,设置key-value和超时时间(秒)
*
* @param key
* @param value
* @param timeout
* (以秒为单位)
*/
public void set(String key, String value, long timeout) {
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
}
/**
* 实现命令:GET key,返回 key所关联的字符串值。
*
* @param key
* @return value
*/
public String get(String key) {
return (String)redisTemplate.opsForValue().get(key);
}
// Hash(哈希表)
/**
* 实现命令:HSET key field value,将哈希表 key中的域 field的值设为 value
*
* @param key
* @param field
* @param value
*/
public void hset(String key, String field, Object value) {
redisTemplate.opsForHash().put(key, field, value);
}
/**
* 实现命令:HGET key field,返回哈希表 key中给定域 field的值
*
* @param key
* @param field
* @return
*/
public String hget(String key, String field) {
return (String) redisTemplate.opsForHash().get(key, field);
}
/**
* 实现命令:HDEL key field [field ...],删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
*
* @param key
* @param fields
*/
public void hdel(String key, Object... fields) {
redisTemplate.opsForHash().delete(key, fields);
}
/**
* 实现命令:HGETALL key,返回哈希表 key中,所有的域和值。
*
* @param key
* @return
*/
public Map
编写RedisController类
@RestController
@RequestMapping("redis")
public class RedisController {
@Autowired
private StringRedisTemplate strRedis;
@Autowired
private RedisOperator redis;
@RequestMapping("/test")
public IMoocJSONResult test() {
strRedis.opsForValue().set("imooc-cache", "hello 慕课网~~~~~~");
SysUser user = new SysUser();
user.setId("100111");
user.setUsername("imooc");
user.setPassword("abc123");
user.setIsDelete(0);
user.setRegistTime(new Date());
strRedis.opsForValue().set("json:user", JsonUtils.objectToJson(user));
SysUser jsonUser = JsonUtils.jsonToPojo(strRedis.opsForValue().get("json:user"), SysUser.class);
return IMoocJSONResult.ok(jsonUser);
}
@RequestMapping("/getJsonList")
public IMoocJSONResult getJsonList() {
User user = new User();
user.setAge(18);
user.setName("慕课网");
user.setPassword("123456");
user.setBirthday(new Date());
User u1 = new User();
u1.setAge(19);
u1.setName("imooc");
u1.setPassword("123456");
u1.setBirthday(new Date());
User u2 = new User();
u2.setAge(17);
u2.setName("hello imooc");
u2.setPassword("123456");
u2.setBirthday(new Date());
List userList = new ArrayList<>();
userList.add(user);
userList.add(u1);
userList.add(u2);
redis.set("json:info:userlist", JsonUtils.objectToJson(userList), 2000);
String userListJson = redis.get("json:info:userlist");
List userListBorn = JsonUtils.jsonToList(userListJson, User.class);
return IMoocJSONResult.ok(userListBorn);
}
}
1. 修改BootStartApplication启动类,增加注解
//开启定时任务
@EnableScheduling
2. 编写TestTask类
@Component
public class TestTask {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
// 定义每过3秒执行任务
// @Scheduled(fixedRate = 3000)
@Scheduled(cron = "4-40 * * * * ?")
public void reportCurrentTime() {
System.out.println("现在时间:" + dateFormat.format(new Date()));
}
}
cron表达式地址:http://cron.qqe2.com
springboot定时任务支持6位,不支持年
异步任务使用场景
代码编写
1.修改BootStartApplication启动类,增加注解
//开启异步调用方法
@EnableAsync
2.编写AsyncTask类
定义@Component @Async作为组件被容器扫面执行
/**
*
* 标题: 自定义异步执行任务
* 描述: 异步方法需使用 @Async 注解
* 判断任务是否完成,必须返回 Future 接口
* @author zc
* @date 2018/04/26
*/
@Component
public class AsyncTask {
@Async
public Future doTask11() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(1000);
long end = System.currentTimeMillis();
System.out.println("任务1耗时:" + (end - start) + "毫秒");
return new AsyncResult<>(true);
}
@Async
public Future doTask22() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(700);
long end = System.currentTimeMillis();
System.out.println("任务2耗时:" + (end - start) + "毫秒");
return new AsyncResult<>(true);
}
@Async
public Future doTask33() throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(600);
long end = System.currentTimeMillis();
System.out.println("任务3耗时:" + (end - start) + "毫秒");
return new AsyncResult<>(true);
}
}
3.编写DoTaskController类
调用异步任务
@RestController
@RequestMapping("tasks")
public class DoTaskController {
@Autowired
private AsyncTask asyncTask;
@RequestMapping("test1")
public String test1() throws Exception {
long start = System.currentTimeMillis();
Future a = asyncTask.doTask11();
Future b = asyncTask.doTask22();
Future c = asyncTask.doTask33();
while (!a.isDone() || !b.isDone() || !c.isDone()) {
if (a.isDone() && b.isDone() && c.isDone()) {
break;
}
}
long end = System.currentTimeMillis();
String times = "任务全部完成,总耗时:" + (end - start) + "毫秒";
System.out.println(times);
return times;
}
}
代码编写
1.编写OneInterceptor类
/**
*
* 标题: 自定义拦截器一
* 描述: 拦截器
*
* @author zc
* @date 2018/04/26
*/
public class OneInterceptor implements HandlerInterceptor {
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object object) throws Exception {
System.out.println("被one拦截,放行...");
return true;
/*if (true) {
returnErrorResponse(response, IMoocJSONResult.errorMsg("被one拦截..."));
}
return false;*/
}
/**
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object object, ModelAndView mv)
throws Exception {
// TODO Auto-generated method stub
}
/**
* 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行
* (主要是用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object object, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
public void returnErrorResponse(HttpServletResponse response, IMoocJSONResult result)
throws IOException, UnsupportedEncodingException {
OutputStream out=null;
try{
response.setCharacterEncoding("utf-8");
response.setContentType("text/json");
out = response.getOutputStream();
out.write(JsonUtils.objectToJson(result).getBytes("utf-8"));
out.flush();
} finally{
if(out!=null){
out.close();
}
}
}
}
2.编写TwoInterceptor类
/**
*
* 标题: 自定义拦截器二
* 描述: 拦截器
*
* @author zc
* @date 2018/04/26
*/
public class TwoInterceptor implements HandlerInterceptor {
final static Logger log = LoggerFactory.getLogger(TwoInterceptor.class);
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
if (true) {
returnErrorResponse(response, IMoocJSONResult.errorMsg("被two拦截..."));
}
System.out.println("被two拦截...");
return false;
}
/**
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv)
throws Exception {
// TODO Auto-generated method stub
}
/**
* 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
public void returnErrorResponse(HttpServletResponse response, IMoocJSONResult result) throws IOException, UnsupportedEncodingException {
OutputStream out=null;
try{
response.setCharacterEncoding("utf-8");
response.setContentType("text/json");
out = response.getOutputStream();
out.write(JsonUtils.objectToJson(result).getBytes("utf-8"));
out.flush();
} finally{
if(out!=null){
out.close();
}
}
}
}
3.编写WebMvcConfig类
/**
*
* 标题: 自定义配置类
* 描述: 注册自定义的拦截器
*
* @author zc
* @date 2018/04/26
*/
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
/**
* 拦截器按照顺序执行
* /two/**:接口/two里面的方法都可以被拦截
* /*/**:所有接口里面的方法都可以被拦截
*/
registry.addInterceptor(new TwoInterceptor()).addPathPatterns("/two/**")
.addPathPatterns("/one/**");
registry.addInterceptor(new OneInterceptor()).addPathPatterns("/one/**");
super.addInterceptors(registry);
}
}
点击查询源码