除了定义一个的实体{"code":"","msg":"","res":""}
类进行约定申明外,还可以这样操作:
在springMvc的@ResponseBody返回时,会调用MappingJackson2HttpMessageConverter和StringHttpMessageConverter两个类进行处理。于是,可以继承该类,对其进行操作:
//在一个全局配置类上加入如下的两个自定义Bean
@Bean
@ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class, search = SearchStrategy.CURRENT)
public MappingJackson2HttpMessageConverter getJsonMessageConvent(@Value("${spring.http.encoding.charset:utf-8}") String encoding) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
JsonMessageConverter mappingJackson2HttpMessageConverter = new JsonMessageConverter();
mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
return mappingJackson2HttpMessageConverter;
}
@Bean
@ConditionalOnMissingBean(value = StringHttpMessageConverter.class, search = SearchStrategy.CURRENT)
public StringHttpMessageConverter getStringMessageConvent(@Value("${spring.http.encoding.charset:utf-8}") String encoding) {
StringMessageConverter stringMessageConverter = new StringMessageConverter();
stringMessageConverter.setDefaultCharset(Charset.forName(encoding));
return stringMessageConverter;
}
例如,代码自动生成模块,利用的就是velocity自定好的模板文件.vm。
优先级由高到底,高优先级的配置会覆盖低优先级的配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
spring:
data:
mongodb:
uri: mongodb://root:root@127.0.0.1:27017/demo
#集群设置:spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database
这里的
classpath
对应SpringBoot中的src/main/resources/
。当搜索文件时,存在同名文件的时候按加载顺序查询查找,找到就不继续往下寻找了。SpringBoot中可以直接将静态资源文件放在classpath下,然后可以直接通过ip:port/
进行访问。
更改静态资源位置:
@Configuration
public class MyURLPatternConfiguration extends WebMvcConfigurationSupport {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//通过 ip:port/fileData/ 访问时,默认链接到 classpath:/myFile/。此时系统默认的四种方式失效,如需任有效,需添加多个 addResourceHandlers
registry.addResourceHandler("/fileData/**").addResourceLocations("classpath:/myFile/");
super.addResourceHandlers(registry);
}
}
或者,通过配置文件完成:
# 设置当URI为/fileData/**时,才进过静态资源
# 注:如果设置为/**,那么表示任何访问都会经过静态资源路径
spring.mvc.static-path-pattern=/fileData/**
# 自定义路径
# 注:自定义路径时,默认的四个文件夹下中的“META-INF下的resoures文件夹”仍然有效,其他三个文件夹失效
# (此时:访问ip:端口号/fileData/时,相当于访问到了 “自定义的文件夹”和 “META-INF下的resoures文件夹”);
# 注:搜索文件时,自定义的文件夹的优先级要高于默认的四个文件夹
spring.resources.static-locations=classpath:/myFile/
# 提示:如果我们显式地把自定义文件夹 和 默认的四个文件夹都写出来,那么都会有效(此时,优先级 从左至右 依次降低)
#spring.resources.static-locations = classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/myFile/
1、添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
<version>${mybatisplus-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatisplus.version}</version>
</dependency>
1、引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
如果加入了security依赖,则所有的接口默认都需要被验证,如果只想 /admin路径下的请求进行验证,则需要加入配置
security.basic.enabled=true
security.basic.path=/admin
security.user.name=admin
security.user.password=password
actuator暴露的health接口权限是由两个配置:management.security.enabled
和 endpoints.health.sensitive
组合的结果进行返回的。
1、添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
Spring Task:Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
Quartz:这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
## 方式一、固定时间
@Scheduled(fixedDelay = 5000) //上次执行完成后,每 5s 调用一次
public void doSomething() {
// something that should execute periodically
}
## 方式二、固定速率(周期)
@Scheduled(fixedRate = 5000) //上次执行时间点后,每 5s 调用一次
public void doSomething() {
// something that should execute periodically
}
## 方式三、
@Scheduled(cron = "0 0 2 * * ?") //每天凌晨两点执行
public void doSomething(){
// something that should execute periodically
}
注:如果执行某次操作时,方法被阻塞了,下次方法到来时并不会立马执行,都会先去执行上次没有执行的任务。
使用ThreadPoolTask实现一个机遇线程池的TaskExector。
1)配置类:
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@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;
}
}