@Produces(“application/json”)
指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
@Consumes(“application/json”)
指定接收请求的内容类型(Content-Type),例如application/json, text/html;
请求的类型
request header Content-Type是前端规定的请求头的响应类型,常用的类型有
application/x-www-form-urlencoded : form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)。
multipart/form-data : 当你需要在表单中进行文件上传时,就需要使用该格式;
application/xhtml+xml :XHTML格式
application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式
application/json : JSON数据格式
application/pdf :pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型
@PathVariable
获取请求路径中的参数
@RequestMapping("show/{id}/{name}")
public void test5(@PathVariable("id") Long ids ,@PathVariable("name") String names){
}
@RequestParam
用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。提交方式为get或post。
实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。
get方式中query String的值,和post方式中body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以get方法和post方法都可以获取的到。
//接收数组参数
@RequestParam(value = "array[]")String[] array
//接收集合参数
@RequestParam(value = "list[]") List<String> list
@ModelAttribute
注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
也可以加在方法参数上,用于代替多个@RequestParam,将其直接映射成一个对象
@GetMapping("/quick")
public Msg ksClick(@ModelAttribute AdQuick info) {
log.info("快手广告:{}", JSON.toJSONString(info));
if (StringUtils.isNotEmpty(info.getImei2()) || StringUtils.isNotEmpty(info.getIdfa2()) ||
StringUtils.isNotEmpty(info.getAndroidId2()) || StringUtils.isNotEmpty(info.getOaid())) {
info.setAddTime(System.currentTimeMillis());
info.setAddDate(LocalDate.now().toString());
info.setAddHour(CommonUtils.getHour());
mongoTemplate.save(info);
}
return Msg.builder().build();
}
@RequestBody
处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。
用来接收前端传递给后端的请求体中的数据(json字符串中的数据);
不能用于get请求,因为get请求中没有请求体,还是用@RequestParam接收。
一般用于post请求,一个请求,只有一个RequestBody,可以有多个RequestParam。
在后端同一个接收方法里,@RequestBody与@RequestParam()可以同时使用。
原SpringMVC接收参数的机制不变,只不过RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收)。
@ResponseBody
通常使用在控制层(controller)的方法上,其作用是将方法的返回值以特定的格式写入到response的body区域,进而将数据返回给客户端。当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。
假如是字符串则直接将字符串写到客户端,假如是一个对象,此时会将对象转化为json串然后写到客户端。这里需要注意的是,如果返回对象,按utf-8编码。如果返回String,默认按iso8859-1编码,页面可能出现乱码。因此在注解中我们可以手动修改编码格式,例如@RequestMapping(value="/cat/query",produces=“text/html;charset=utf-8”),前面是请求的路径,后面是编码格式。
那么,控制层方法的返回值是如何转化为json格式的字符串的呢?其实是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。如果是bean对象,会调用对象的getXXX()方法获取属性值并且以键值对的形式进行封装,进而转化为json串。如果是map集合,采用get(key)方式获取value值,然后进行封装。
@Transactional
添加事务控制
@Repository
用于标注数据访问组件,即DAO组件
@Entity
表明该类为一个实体类,它默认对应数据库中相同名称的表。这里也可以指定数据库对应的表
@Entity(name = “xwj_user”)
或者
@Entity
@Table(name = “xwj_user”, schema = “test”)
查看@Entity注解,发现其只有一个属性name,表示其所对应的数据库中的表名
@Table
当实体类与其映射的数据库表名不同名时需要使用 @Table注解说明,该标注与 @Entity 注解并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。
@Table注解的常用选项是 name,用于指明数据库的表名
@Table注解还有两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名
@DynamicUpdate
Data Jpa注解,添加在实体类上,用于jpa自动更新数据表的修改时间
@Valid
用于验证是否符合注解要求 https://blog.csdn.net/weixin_38118016/article/details/80977207
@Column
当数据库字段与实体类字段名称不一致时,需用@Column来声明映射关系
@Column(name = “last_name”)
private String lastName;
@Transient
org.springframework.data.annotation.Transient
不跟数据库表做映射 就是表中没有这个字段。
可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient这样serialization会忽略掉。
@NonNull
标注在方法、字段、参数之上,表示对应的值不可以为空
@Nullable
可以标注在方法、字段、参数之上,表示对应的值可以为空
@Bean
放在方法上,用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
@Component
泛指组件,当组件不好归类的时候,可以使用这个注解进行标注,用来注册Bean并装配到Spring的IOC容器中。
@ComponentScan
自动扫描包名下所有使用@Component、@Controller、@Service、@Repository的类,并注册为Bean
@Value
获取在yml等配置文件中自定义属性
#yml文件
myProperty:
myName: zhang
#测试
@Value("${myProperty.myName}")
private String myName;
@Test
public void stringTest(){
ogger.info("TestController:{}",myName);
}
结果
TestController:zhang
@Configuation
用于定义配置类,可替换xml配置文件
被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@ConfigurationProperties
也是读取配置文件定义的属性,批量将属性映射到实体类中,理解为@Value的批量处理
@Component
@ConfigurationProperties(prefix="定义属性的上级名称")
public class Person{
//定义与属性相对应的字段
}
@Autowired
默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false)
如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;
@Resource
(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@PostConstruct
被修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。
被修饰的方法会在构造函数之后,init()方法之前运行。
@PreDestroy
被修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。
被修饰的方法会在destroy()方法之后,在Servlet被彻底卸载之前运行。
Spring Boot 内置了jackson来完成JSON的序列化和反序列化操作。
@JsonProperty
此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name (返回给前端时为name更改后的名称)
import com.fasterxml.jackson.annotation.JsonProperty;
public class Student {
@JsonProperty("name")
private String trueName;
}
@JsonSerialize
主要用于数据转换,该注解作用在该属性的getter()方法上
例1:Long太长前端接收会有精度问题,让后台Long以字符串形式传输给前端
@JsonSerialize(using = ToStringSerializer.class)
private Long age;
例2:当前端显示和后台存储数据单位不统一时,比如前端要求一个double时在其后面限制两位小数点。因为在java中日期时期的时间戳是ms,我现在需要将ms转换为s,就需要将ms/1000
- 写一个负责转换的类,里面写好规则
package com.whf.utils.serializer;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.util.Date;
import java.io.IOException;
/**
*该类可以将data转换成long类型
*/
public class Data2LongSerizlizer extends JsonSerializer<Date> {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
//将毫秒值转换成秒变成long型数据返回
jsonGenerator.writeNumber(date.getTime()/1000);
}
}
- 在实体类上需要装换的字段上加上注解
//创建时间
@JsonSerialize(using = Data2LongSerizlizer.class )
private Date createTime;
//更新时间
@JsonSerialize(using = Data2LongSerizlizer.class )
private Date updateTime;
@JsonInclude(JsonInclude.Include.NON_NULL)
加在类上,如果某属性为空null,则json序列化,不返回该属性
spring boot配置做法
#此在配置文件就如同注解一般, 起到异曲同工之妙
spring:
jackson:
default-property-inclusion: non_null
@JsonIgnore
作用在属性上,用来忽略此属性。
@JsonIgnoreProperties
忽略一组属性,作用于类上
@JsonIgnoreProperties({"id","photo"})
public class User {}
@JsonFormat
用于日期格式化。
@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss", timezone = "GMT+8")
private Date d;
@CacheCacheable
可以标记在一个方法上,也可以标记在一个类上
对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。
@CachePut
与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
@CacheEvict
用来标注在需要清除缓存元素的方法或类上。
@Profile({“release”})
加在类和方法上指定生效的环境
@EnableScheduling
加在定时任务上,用于开启定时任务
@Scheduled(fixedDelay = 3600000L)
加在定时任务方法上,指定开启的时间间隔
@Async
在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。
在同一个类里面,用一个方法去调用另外一个有@Async注解的方法,异步方法不会生效