记录 Spring Boot 中使用的常用注解

简单记录 pmsys 使用到的 ,也有没有使用到的

@SpringBootApplication

主类的注解。相当于(@Configuration@EnableAutoConfiguration @ComponentScan)及他们的默认属性

PS: 通常建议您将主应用类放在其它类之上的根包中, @EnableAutoConfiguration 注解通常放在主类上,它隐式定义了某些项目的 包搜索的基准起点。

根据 SpringBoot 官网,这三个注解的作用分别是:

  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
  • @ComponentScan: 扫描被(@Component@Service@Repository@Controller 等)注解的 bean,注解默认会扫描该类所在的包下所有的类。
  • @Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类

@Component 与 @Configuration

都可以声明配置类,但 @Configuration 更加语义化。

从定义来看,@Configuration 注解本质上还是 @Component

  • @Component :泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用 @Component 来标注这个类。

  • @Configuration :用于定义配置类,被注解的类内部包含有一个或多个被 @Bean 注解的方法,等价于spring的xml配置文件中的<bean>,作用为:注册bean对象。

    PS: bean 方法会被 AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext 类进行扫描,并用于构建 bean 定义,初始化 Spring 容器

@Repository , @Service , @Controller

传统 MVC 必备三个注解,分别是:

  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。

  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。

    实现接口的形式,为了区别还是取名

    @Service("appraiseService")
    public class AppraiseServiceImpl implements AppraiseService {}
    
  • @Controller : 对应控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。

@RestController

在前后端分离的项目中控制层使用 @RestController 注解,该注解是是 @Controller 和 @ResponseBody 的合集。
@RestController 只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务。

如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用@Controller 并结合@ResponseBody注解

依赖注入 @Autowired 与 @Resource

用于依赖注入,不过 @Autowired 只按照 byType 注入,是 Spring 的;@Resource 默认按 byName 自动注入,也提供按照 byType 注入,是 JDK 的;

被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。

PS: 现在装配是用构造注入,非必须用 Set 注入。不再是直接标注在字段上。

注意,构造注入允许字段被修饰为 final,这表示以后它不能被更改

五大请求 GET、POST、PUT、DELETE、PATCH

  • GET :请求从服务器获取特定资源。举个例子:GET /users(获取所有学生)

    @GetMapping("users") 等价于 @RequestMapping(value="/users",method=RequestMethod.GET)

  • POST :在服务器上创建一个新的资源。举个例子:POST /users(创建学生)

    @PostMapping("users") 等价于 @RequestMapping(value="/users",method=RequestMethod.POST)

  • PUT :更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /users/12(更新编号为 12 的学生)

    @PutMapping("/users/{userId}") 等价于 @RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)

  • DELETE :从服务器删除特定的资源。举个例子:DELETE /users/12(删除编号为 12 的学生)

    @DeleteMapping("/users/{userId}") 等价于 @RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)

  • PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了。

    @PatchMapping("/profile") 等价于 @RequestMapping(value = "/profile", method = RequestMethod.PATCH)

地址栏取值 @PathVariable 和 @RequestParam

@PathVariable用于获取路径参数,如上的 userId ,就是用@PathVariable 取。

@RequestParam用于获取查询参数, 取地址栏问号 后的值。

@RequestBody

用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且 Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用 HttpMessageConverter 或者自定义的 HttpMessageConverter 将请求的 body 中的 json 字符串转换为 java 对象。

读取配置信息 @Value 及两个没用过

常用就是 @Value 直接读取信息,举个例子:

@Value("${fastdfs.nginx.host}")
private String nginxHost;

配置文件中是:

fastdfs.nginx.host=http://192.168.1.10/

还有两个 @ConfigurationProperties@PropertySource ,学习 10 分钟搞定 SpringBoot 如何优雅读取配置文件?

事务 @Transactional 摘自 JavaGuide

在要开启事务的方法上使用@Transactional注解即可!

@Transactional(rollbackFor = Exception.class)
public void save() {
  ......
}

我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚。

@Transactional 注解一般用在可以作用在或者方法上。

  • 作用于类:当把@Transactional 注解放在类上时,表示所有该类的public 方法都配置相同的事务属性信息。
  • 作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。

更多关于关于 Spring 事务的内容请查看:

  1. 可能是最漂亮的 Spring 事务管理详解
  2. 一口气说出 6 种 @Transactional 注解失效场景

json 数据处理

@JsonFormat(pattern = "yyyy-MM-dd",timezone = "Asia/Shanghai")

定时任务 @Scheduled 和 @EnableScheduling

@Scheduled 标记要调度的方法的注解。必须指定 cronfixedDelayfixedRate 属性之一。该注解共有8个参数,以下对这个8个参数进行记录

PS : 主类中要加 @EnableScheduling 表示开启对定时任务的支持

  1. cron : 该参数为cron表达式,从左到右: [秒] [分] [小时] [日] [月] [周]

    @Scheduled(cron = "0/30 * * * * ?") 表示 30 秒执行一次
    
  2. zone : 时区,cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai。该字段我们一般留空。

  3. fixedDelay : 从上次调用结束到下一次调用之间的固定时间(以毫秒为单位)

@Scheduled(fixedDelay = 5000) *//上次调用结束后5秒再执行*
  1. fixedDelayString : 与 fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符
@Scheduled(fixedDelayString = "5000")  

//占位符的使用(配置文件中有配置:time.fixedDelay=5000):
@Scheduled(fixedDelayString = "${time.fixedDelay}")
  1. fixedRate : 两次调用之间固定的毫秒数,
  2. fixedRateString : 与 fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
  3. initialDelay : 第一次执行 fixedRate 或者 fixedDelay 任务之前要延迟的毫秒数
  4. initialDelayString : 与 initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

参考

JavaGuide

Spring Boot 中文文档

@RestController vs @Controller

@Autowired和@Resource的区别是什么?

@Scheduled使用及讲解

posted @ 2021-03-23 16:02  东郊  阅读(147)  评论(0编辑  收藏  举报