@EqualsAndHashCode(callSuper = true)
避免子类在进行类型判断是出现错误。
具体参考https://www.jianshu.com/p/16571aad10a2
@JsonProperty(“”)
@JsonProperty注解主要用于实体类的属性上,作用可以简单的理解为在反序列化的时候给属性重命名
序列化和反序列化
序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。
对象的序列化主要有两种用途:
把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)
在网络上传送对象的字节序列。(网络传输对象)
Spring Boot 内置了jackson来完成JSON的序列化和反序列化操作。Jackson使用ObjectMapper类将POJO对象序列化成JSON字符串,也能将JSON字符串反序列化成POJO对象。
Jackson包含了很多注解,用来个性化序列化和反序列化操作,主要有如下注解
@JsonProperty,作用在属性上,用来为JSON Key指定一个别名。
@JsonIgnore,作用在属性上,用来忽略此属性。在json序列化时将对象中的一些属性忽略掉,标记在属性或者方法上,返回的json数据不包含该属性。
@JsonIgnoreProperties,忽略一组属性,作用于类上
@JsonFormat,用于日期格式化。
@JsonSerialize,指定一个实现类来自定义序列化。类必须实现JsonSerializer接口。
@Valid注解
@Valid 注解,表示我们对这个对象属性需要进行验证,
在实体类上
既然验证,那么就肯定会有验证结果,所以我们需要用一个东西来存放验证结果,做法也很简单,在参数直接添加一个BindingResult,具体如下
对应获取验证结果的代码如下:
@Value注解
@Value将外部配置文件的值动态注入到Bean中。配置文件主要有两类:
application.properties。application.properties在spring boot启动时默认加载此文件
将配置文件中的值注入进去
@Accessors(chain = true)
这个注解是来至于lombok里面的 只需要在实体类加上就可以开启链式编程了
@RequiredArgsConstructor
在我们写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@AutoWired注解,代码看起来很乱 lombok提供了一个注解:@RequiredArgsConstructor就不用写@AutoWired注解的方式
@Mapper注解
扫描项目中的Dao层,将dao接口类注入到Spring,能够让其他类进行引用;
@MapperScan
扫描项目中的Dao层,将dao接口类注入到Spring,能够让其他类进行引用;
可以指定要扫描的dao接口类的路径,可以在启动类中添加此注解,可替代@Mapper注解(此模块内dao接口类不用都添加@Mapper注解)
@MapperScan("com.demo.mapper"):扫描指定包中的接
@EnableCaching
开启基于注解的缓存
是spring framework中的注解驱动的缓存管理功能。
结合相应的注解后,会实现只查询了一次数据库,缓存效果达到。
@PathVariable(路径参数)
这个其实是springMvc中的注解
用于接收路径参数,比如@RequestMapping(“/hello/{name}”)声明的路径,将注解放在参数前,即可获取该值,通常作为Restful的接口实现方法。
如下所示:
@GetMapping("/user/{userId}") public User selectUserByUserId(@PathVariable("userId") Integer userId){ User user = userService.selectUserByUserId(userId); return user; } • 1 • 2 • 3 • 4 • 5
@ConfigurationProperties注解
只要在bean上添加上这个注解,指定好配置文件的前缀,那么对应的配置文件数据就会自动填充到bean中。举个栗子,现在有如下配置:
配置文件myconfig
myconfig.name=test myconfig.age=22 myconfig.desc=这是我的测试描述
添加对应的配置类,并添加上注解@ConfigurationProperties,指定前缀为myconfig
@Component @ConfigurationProperties(prefix = "myconfig") public class MyConfig { private String name; private Integer age; private String desc; //get/set 略 @Override public String toString() { return "MyConfig [name=" + name + ", age=" + age + ", desc=" + desc + "]"; } }
测试
public static void main(String[] args) throws Exception { SpringApplication springApplication = new SpringApplication(Application.class); // 非web环境 springApplication.setWebEnvironment(false); ConfigurableApplicationContext application = springApplication.run(args); MyConfig config = application.getBean(MyConfig.class); log.info(config.toString()); application.close(); }
可以看到输出log
com.cml.chat.lesson.lesson3.Application - MyConfig [name=test, age=22, desc=这是我的测试描述]
@Bean注解
@Bean表示方法产生一个由Spring管理的bean,属性的名称语义与Spring XML中的 标签配置的一样。
使用例子 作用在方法上
public class DataSource { private String url; private String userId; private String password; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "DataSource{" + "url='" + url + '\'' + ", userId='" + userId + '\'' + ", password='" + password + '\'' + '}'; } }
@Configuration public class DataBaseConfig { @Bean("dataSource") public DataSource getDataSource(){ DataSource dataSource = new DataSource(); dataSource.setUserId("jingsi"); dataSource.setPassword("123456"); dataSource.setUrl("www"); return dataSource; } }
@Component注解
@Component这个注解说把这个类交给Spring管理
在持久层、业务层和控制层中,分别采用@Repository、@Service和@Controller
@ResponseBody注解
@ResponseBody并不是以json返回。不加@ResponseBody,是将方法返回的值作为视图名称,并自动匹配视图去显示,而加上@ResponseBody就仅仅是将方法返回值当作内容直接返回到客户端,并且会自适应响应头的content-type,返回的字符串符合json,那么content-type就是application/json,如果是普通字符串,就是text/plain,但是加上注解属性produces=application/json,那么不管内容是什么格式,响应头的content-type就一直是application/json,不再去做自适应,至于内容是不是json都不重要了
@RequestParam(查询参数)
适应于key-value类型
作用:
把请求中指定名称的参数给控制器中的形参赋值。
属性:
value: 请求参数中的名称。
required:请求参数中是否必须提供此参数。 默认值: true。表示必须提供,如果不提供将报错
public String useRequestParam(@RequestParam("name")String username, @RequestParam(value="age",required=false)Integer age){ System.out.println(username+","+age); return "success"; }
@RequestBody
这个适应于对象,json,list等类型
postman测试结果
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用**@RequestBody接收数据时,一般都用POST方式进行提交**。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
注:一个请求,只有一个RequestBody;一个请求,可以有多个RequestParam。
注:当同时使用@RequestParam()和@RequestBody时,@RequestParam()指定的参数可以是普通元素、
数组、集合、对象等等(即:当,@RequestBody 与@RequestParam()可以同时使用时,原SpringMVC接收
参数的机制不变,只不过RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value
里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收)。
即:如果参数时放在请求体中,application/json传入后台的话,那么后台要用@RequestBody才能接收到;
如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或
则形参前 什么也不写也能接收
@Data注解
不用再手动添加get/set等方法了,大大提高了写代码的速度。
1、在idea中直接在plugins下载lombok
2、重启编辑器
3、在pom.xml添加maven依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> </dependency>
@ControllerAdvice
是@Controller注解的一个增强,这个注解是Spring里面的东西,可以处理全局异常。当然在Spring Boot中也可以使用,但是Spring Boot中有它全自动化配置的异常处理,因为是全自动化的,因此也可以自己定制,比如定制它的异常页面,异常信息提示,异常视图。这里的话主要看一下,这个注解怎么用。它主要有一下几个功能:
处理全局异常
预设全局数据
请求参数预处理
@Async
在启动类上加上@EnableAsync注解,即可使得@Async注解生效。
@Transactional
声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
简而言之,@Transactional注解在代码执行出错的时候能够进行事务的回滚。