java注解学习

本文介绍了Lombok注解,提供其在线帮助文档,阐述了多个Lombok注解的使用场景。还提及了其他Java注解,如@JsonFormat、@Mapper、@Service等,说明了它们在时间格式处理、MyBatis映射、Spring容器注册等方面的作用,也对比了@RestController和@Controller的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lombok 注解

Lombok 注解在线帮助文档:https://projectlombok.org/features/index.html

  • @Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equalscanEqualhashCodetoString 方法
  • @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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值