lombok 注解
Lombok 注解在线帮助文档:https://projectlombok.org/features/index.html
@Data
:注解在类上;提供类所有属性的getting
和setting
方法,此外还提供了equals
、canEqual
、hashCode
、toString
方法@Setter
:注解在属性上;为属性提供setting
方法@Getter
:注解在属性上;为属性提供getting
方法@Log4j
:注解在类上;为类提供一个 属性名为log 的log4j
日志对象@NoArgsConstructor
:注解在类上;为类提供一个无参的构造方法@AllArgsConstructor
:注解在类上;为类提供一个全参的构造方法@NonNull
:注解在参数上,可以省略重复的if( null == persion)
这类异常处理@Cleanup
:注解在输入输出流等需要释放资源的变量上,不需要写额外繁琐而重复的释放资源代码
@Cleanup 的例子:
import lombok.Cleanup;
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
@Data @Log4j @NoArgsConstructor @AllArgsConstructor的例子:
@Data
@Log4j
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String id;
private String name;
private String identity;
}
@JsonFormat使用:这的意思就是让时间字段返回前台的时候是以pattern的形式,而返回的后台的数据也会以同样的方式来返回,而timezone的作用是返回的时间以北京的时间为标准。
//这是直接写在了属性上
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date uploadTime;
//第二种写在了getting方法上
public String getUploadTime(){
return uploadTime;
}
@Mapper 使用这个主要是mybatis的映射,在编译的时候会生成相应的实现类,这个接口是不可以定义相同的方法名法名的,编译的时候会生成相同的id,也就说着个是不支持方法重载的;
@Mapper
public interface UserDAO {
@Select("select * from user where name = #{name}")
public User find(String name);
@Select("select * from user where name = #{name} and pwd = #{pwd}")
/**
* 对于多个参数来说,每个参数之前都要加上@Param注解,
* 要不然会找不到对应的参数进而报错
*/
public User login(@Param("name")String name, @Param("pwd")String pwd);
}
@Service (业务成)注解的使用:在springMvc中的applicationContext.xml中会见到:
<context:component-scan base-package="com.xxx.xxx"/>
加上这一行的配置,当启动程序的时候会自动扫描该路径下的类,如果一个类前面的带着@Service,就会在spring的容器中的注册,不需要再applicationContext.xml中的注册bean了。
@Service
public class AuditServiceImpl implements AuditService {
.......
}
@Api("/xxx")注解:用于类,标识这个类是swagger资源(不太懂,就是简单的记录下),总之是生成的api的,用于交互。
tags–表示说明
value–也是说明,可以使用tags替代,但是tags如果有多个值,会生成多个list
@RestController 注解:
@Api(value="用户controller",tags={"用户操作接口"})
@RestController
public class UserController {
......
}
发现和以前写的不一样的地方@RestController和@Controller,这个有什么区别吗?
它们都是来声明是控制层接口的,但是@Controller和@ResponseBody配合使用,如果不加@ResponseBody这个表示返回的的是页面,反之是表示的是接送数据;
package com.crystal.api.controller;
import com.crystal.api.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* controller 的注解必须要使用 viewResolver : 前提是没有加 ResponseBody 注解
* controller注解中加上了 ResponseBody 注解,代表返回json格式
*/
@Controller
@RequestMapping(value = "/v2/hello")
public class HelloWordController {
/**
* 返回json 格式的数据
*
* @param name
* @return
*/
@RequestMapping(value = "/world", method = RequestMethod.GET)
@ResponseBody
public String returnJson(String name) {
System.out.println("name : " + name);
return "hello";
}
/**
* 返回页面 ,视图
*
* @param name
* @return
*/
@RequestMapping(value = "crystal")
public String returnView(String name) {
System.out.println("name : " + name);
return "hello";
}
/**
* ResponseBody 注解,代表返回json格式
* RequestBody 注解 ,代表 json格式提交数据
*
* @param user
* @return
*/
@RequestMapping(value = "/test/json", method = RequestMethod.POST)
@ResponseBody
public User testJson(@RequestBody User user) {
System.out.println(user.getId());
System.out.println(user.getName());
return user;
}
/**
* ResponseBody 注解,代表返回json格式
* form 形式的提交数据
*
* @param user
* @return
*/
@RequestMapping(value = "/test/post", method = RequestMethod.POST)
@ResponseBody
public User testPost(User user) {
System.out.println(user.getId());
System.out.println(user.getName());
return user;
}
}
@RestController注解表示 ,等于@Controller + @ResponseBody
@RestController
@RequestMapping(value = "/rest", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
public class RestHelloController {
/**
* get method
*
* @param name
* @return
*/
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello(@RequestParam("name") String name) {
System.out.println("name:" + name);
return name;
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
public User save(HttpServletRequest request, @RequestBody User user) {
System.out.println(user.getId());
System.out.println(user.getName());
return user;
}
}
@PostMapping("/xxx") 表示的是以post的方式来请求,相似的@GetMapping("/xxx") ,是以get方式来请求。它们都是@RequestMapping(method = RequestMethod.POST)的缩写。
@PostMapping("/getUserById")
public RestMsg getUserList(@RequestParam(name = "userId", required = false) String userId) {
.....
return new RestMsg();
}
@Slf4j 主要是日志的生成,使用方法:
<!-- 在pom文件中加入依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
代码:
@Slf4j
public class LoggerTest {
private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
/**
* 一、传统方式实现日志
*/
@Test
public void test1(){
logger.debug("debug message");
logger.warn("warn message");
logger.info("info message");
logger.error("error message");
logger.trace("trace message");
}
/**
* 二、注解方式实现日志
*/
@Test
public void test2(){
log.debug("debug message");
log.warn("warn message");
log.info("info message");
log.error("error message");
log.trace("trace message");
}
}
注意:如果找不到log,这就需要给编辑器加上lombok