Spring 相关常用注解

185 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

IoC

org.springframework.stereotype

@Repository

用于标注数据访问组件,即 DAO 实现类

@Service

用于标注业务实现类

@Controller

用于标注控制层类,通常与 RequestMapping 注解结合使用

@Component

泛指组件,当某个组件不好分类时使用该注解,使用在实体类上,不写 value 的话,bean 名字默认为类名首字母小写


DI

org.springframework.beans.factory.annotation

@Autowired

完成属性/字段注入,注入的是 bean(取代 XML property ref 元素)

Autowired和Resource注解细节

  • 可以让Spring将需要的字段或属性找出来并注入到属性或字段上
  • 可以贴在字段或setter方法上
  • 可以同时注入多个对象(一般不需要用到)
  • 可以注入Spring内置的对象,比如ApplicationContext
    • 容器中有容器自己,目的是为了能够在任何地方获取容器中的任何对象
    • 步骤:声明ApplicationContext对象并贴注解,通过getBeansOfType方法可以获取到容器中所有对象
  • 默认情况下Autowired注解必须找到对应的对象,否则会报错。
    • 通过@Autowired(required=false)可以解决这个问题
  • Spring 3.0之前需要手动配置Autowired的解析程序,在 Spring 的测试环境可以不配置,在 Web 开发中换一种配置解决
  • 寻找bean的方式:
    • Autowired:依赖对象类型(setter或字段直接注入) → 名字
      • 通过@Qualifier("名字")注解规定依赖对象按照 bean 的 id 和 类型的组合方式去找
    • Resource:名字(setter或字段直接注入) → 类型 (多个类型则报错)
      • 通过@Resource(name="") 指定bean的名称
@Qualifier("name")

当有多个同一类型的 bean 存在时,可以使用该注解进行指定

@Value

完成属性/字段注入,注入的是常量值(取代 XML property value 元素)


SpringMVC

org.springframework.web.bind.annotation

@RestController

等价于 @Controller + @ResponseBody

@ResponseBody

表示该方法的返回值放在响应体中,一般在异步请求中使用,用于获取数据,比如响应 JSON 数据需要用到该注解

@RequestParam

将请求参数绑定到方法参数上,当请求参数名和形参名不一致时可以使用该注解起名

@RequestMapping("映射路径")

用来处理请求地址映射的注解,用于类或方法上

@ControllerAdvice
  • 全局异常处理
@ControllerAdvice
public class CommonControllerHandler {
    @ExceptionHandler(LogicException.class)
    @ResponseBody
    public JsonResult handleLogicException(Exception e) {
        e.printStackTrace();
        return JsonResult.error(500, e.getMessage(), null);
    }
}
  • 全局数据绑定:用于做一些数据初始化操作

  • 全局数据预处理

@InitBinder
// SpringMVC并不能对所有类型的参数都进行绑定,该注解则能够对WebDataBinder对象进行初始化,
// WebDataBinder是DataBinder的子类,用于完成表单参数到JavaBean属性的绑定
public void handleDateFormat(WebDataBinder binder) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    /*
        setLenient():是否严格解析日期
        true:表示Java会对日期进行计算,比如日期为2021-13-01,则13个月会计算为1年1个月,即日期变为2022-01-01
        false:表示Java不会对日期进行计算,若输入非法日期,则直接抛出异常
     */
    format.setLenient(false);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(format, true));
}
@ExceptionHandler

用于指明异常的处理类型

@ExceptionHandler(RuntimeException.class)
@ResponseBody
public JsonResult handleRuntimeException(Exception e) {
    e.printStackTrace();
    return JsonResult.defaultError();
}
@InitBinder

SpringMVC 并不能对所有类型的参数都进行绑定,该注解则能够对 WebDataBinder 对象进行初始化,WebDataBinder 是 DataBinder 的子类,用于完成表单参数到 JavaBean 属性的绑定

@PathVariable

该注解能够将路径参数从 url 上解析下来,并赋值给接口声明的形参,如果参数路径上的参数名与方法声明形式参数名不一致,则需要明确指定

/**
 * 查询某个部门下的所有员工
 * 
 * 请求路径:/departments/{id}/employees
 * 请求方式: GET
 * 请求参数: id
 * 请求返回值: List<Employee>
 */
GetMapping(value = "/{id}/employees")
public List<Employee> listEmployee(@PathVariable Long id) {
    List<Employee> employees = Arrays.asList(
            new Employee(1L, "小一", 19, id),
            new Employee(2L, "小二", 18, id),
            new Employee(3L, "小三", 20, id)
    );
    return employees;
}

SpringBoot

@SpringBootAplication

表示当前类为 SpringBoot 的引导启动类,由 @SpringBootConfiguration、@EnableAutoConfigutation、@ComponentScan 构成

@SpringBootConfiguration

标记当前类为配置类,继承自 @Configuration,将当前类中声明的一个或多个贴有 @Bean 的方法生成并放到 Spring 容器中,实例名为方法名,相当于<beans></beans>

@EnableAutoConfiguration

字面意思即启用自动配置,用于实现自动配置


Java Config

@Configuration

用于定义配置类,声明一个或多个 @Bean 方法,并交由Spring容器管理,以便在运行时为这些bean生成 BeanDefinition 和服务请求

@Bean

贴了该注解的方法返回的对象会交给 Spring 容器管理,相当于<bean></bean>

属性

  • name:用于给bean取别名
  • initMethod:配置bean的初始化方法
  • destroyMethod:配置bean的销毁方法
@ComponentScan

用于扫描贴有 Spring 提供的 IoC、DI 注解,比如 Service、Controller 等,并创建对象放到 Spring 容器中。如果没有明确指明扫描路径,则代表扫描路径为当前类所在包下的所有类

在 Spring 配置类上贴该注解表示开启组件扫描器,默认扫描当前配置类所在的包,也可以自己指定,相当于<content:component-scan>

@PropertySource

加载指定的 properties 配置文件到 Spring 的 Environment中,Environment 接口提供方法去读取配置文件中的值,参数是 properties 文件中定义的 key 值

@ConfigurationProperties

读取系统全局的配置文件

@ImportResource

导入 Spring 配置文件,让配置文件中的内容生效


日期处理注解

@JsonFormat(pattern = "yyyy-MM-dd HH:mm")

出参格式化

// 出参格式化
JsonFormat(pattern = "yvyy-MM-dd HH:mm")
private Date appointmentTime;                   // 预约时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")

入参格式化

// 入参格式化
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date appointmentTime;                   // 预约时间

定时器

org.springframework.scheduling.annotation

@EnableScheduling

开启对定时任务的支持,贴在类上

@EnableAsync

开启异步事件的支持,贴在类上

@Scheduled

任务调度注解,根据指定执行计划执行方法体逻辑


SpringCloud

@EnableDiscoveryClient

服务注册,在微服务项目中,会分为很多个子项目,每个子项目都会一个启动类,在启动类上贴上该注解,即可注册到注册中心上(比如nacos)

@LoadBalanced

负载均衡,在微服务项目中,我们会对请求比较多的服务进行集群部署,这个时候为了能让每个节点都能够比较平均地接收到请求,就可以使用该注解进行均衡处理

@EnableDiscoveryClient
@SpringBootApplication
public class OrderServer {
    public static void main(String[] args) {
        SpringApplication.run(OrderServer.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}