当前位置: 首页 > 科技观察

40个SpringBoot常用注解:让生产力爆发!

时间:2023-03-14 16:19:59 科技观察

企业开发项目SpringBoot已经是必备框架,而注解是开发中的小工具(随处可见),用得好可以大大提高开发效率,当然使用不当也会引入缺陷。一、SpringWebMVC和SpringBean注解SpringWebMVC注解@RequestMapping@RequestMapping注解的主要作用是将Web请求与请求处理类中的方法进行映射。SpringMVC和SpringWebFlux都通过RquestMappingHandlerMapping和RequestMappingHndlerAdapter类提供对@RequestMapping注解的支持。@RequestMapping注解在请求处理类中标记请求处理方法;@RequestMapping注解有以下六个配置属性:value:映射的请求URL或其别名method:HTTP兼容的方法名params:根据HTTP参数的存在、默认或值过滤请求header:根据HTTPHeader的存在、默认或值过滤请求consume:设置HTTP请求文本中允许的媒体类型product:HTTP响应正文中允许的媒体类型Tip:在使用@之前RequestMapping,请求处理类也需要使用@Controller或者@RestController进行标记下面是两个使用@RequestMapping的例子:@RequestMapping也可以标记类,这样类中的处理方法映射请求路径时,会自动将类上@RequestMapping设置的值拼接到方法映射路径之前,如下:@RequestBody@RequestBody用在处理请求方法的参数列表中。它可以将请求体中的参数绑定到一个对象上。请求体参数通过HttpMessageConverter传递。根据请求体对象的参数名与对象的属性名匹配并绑定值。另外,请求体中的参数也可以通过@Valid注解来校验。下面是@RequestBody的使用示例:@GetMapping@GetMapping注解用于处理HTTPGET请求,并将请求映射到具体的处理方式。具体来说,@GetMapping是一个组合注解,相当于@RequestMapping(method=RequestMethod.GET)的快捷方式。下面是一个使用@GetMapping的例子:@PostMapping@PostMapping注解用于处理HTTPPOST请求,并将请求映射到具体的处理方法。@PostMapping和@GetMapping一样,也是组合注解,相当于@RequestMapping(method=HttpMethod.POST)的快捷方式。下面是一个使用@PostMapping的例子:@PutMapping@PutMapping注解用于处理HTTPPUT请求,并将请求映射到具体的处理方法。@PutMapping是组合注解,相当于Shortcutfor@RequestMapping(method=HttpMethod.PUT)。下面是使用@PutMapping的例子:@DeleteMapping@DeleteMapping注解用于处理HTTPDELETE请求,并将请求映射到删除方法。@DeleteMapping是组合注解,相当于@RequestMapping(method=HttpMethod.DELETE)的快捷方式。下面是使用@DeleteMapping的例子:@PatchMapping@PatchMapping注解用于处理HTTPPATCH请求,并将请求映射到相应的处理方法。@PatchMapping相当于@RequestMapping(method=HttpMethod.PATCH)的快捷方式。下面是一个简单的例子:@ControllerAdvice@ControllerAdvice是@Component注解的扩展注解,Spring会自动扫描检测@ControllerAdvice标记的类。@ControllerAdvice需要和@ExceptionHandler、@InitBinder、@ModelAttribute注解配合使用,主要是处理controller抛出的异常信息。首先,我们需要定义一个@ControllerAdvice标记的类。在这个类中,定义一个处理特定异常的方法,并用@ExceptionHandler注解进行标记。另外,必要时可以在类中使用@InitBinder进行全局配置,使用@ModelAttribute配置view相关的参数。使用@ControllerAdvice注解,可以快速创建一个统一的、自定义的异常处理类。以下是使用@ControllerAdvice的示例代码:@ResponseBody@ResponseBody会自动将控制器中方法的返回值写入HTTP响应。特别是,@ResponseBody注解只能用在标有@Controller注解的类上。如果在标有@RestController的类中,则该方法不需要使用@ResponseBody注释进行注释。@RestController相当于@Controller和@ResponseBody的组合注解。下面是一个使用这个注解的例子@ExceptionHandler@ExceptionHander注解用来注解处理特定类型异常类抛出的异常的方法。当controller中的某个方法抛出异常时,Spring会自动捕获异常,并将捕获到的异常信息传递给@ExceptionHandler注解的方法。下面是一个使用该注解的例子:@ResponseStatus@ResponseStatus注解可以标记请求的处理方式。使用此注释,您可以指定响应所需的HTTPSTATUS。具体来说,我们可以使用HttpStauts类给注解的value属性赋值。以下是使用@ResponseStatus注释的示例:@PathVariable@PathVariable注释将方法中的参数绑定到请求URI中的模板变量。可以通过@RequestMapping注解指定URI的模板变量,然后使用@PathVariable注解将方法中的参数绑定到模板变量上。特别是,@PathVariable注释允许我们使用value或name属性为参数设置别名。下面是使用该注解的例子:模板变量名需要用{}包裹,如果方法的参数名与URI模板变量名一致,@中可以省略别名的定义路径变量。下面是一个简写例子:提示:如果参数是一个非必选的可选项,可以在@PathVariable@RequestParam@RequestParam注解中设置require=false用于绑定方法的参数使用在网络请求中传递的参数。使用@RequestParam可以轻松访问HTTP请求参数的值。下面是使用该注解的代码示例:该注解的其他属性配置与@PathVariable相同。特别地,如果传递的参数为空,也可以通过defaultValue设置一个默认值。示例代码如下:@Controller@Controller是@Component注解的扩展,Spring会自动扫描配置该注解所注解的类。此注释用于注释SpringMVC控制器。下面是使用该注解的示例代码:@RestController@RestController是Spring4.0引入的,是一个具体的controller注解。这个注解相当于@Controller和@ResponseBody的快捷方式。使用此注解时,不再需要在方法上使用@ResponseBody注解。以下是使用该注解的示例代码:@ModelAttribute通过该注解,可以通过模型索引名访问控制器中已经存在的模型。下面是一个使用该注解的简单示例:与@PathVariable和@RequestParam注解一样,如果参数名称与模型同名,则无需指定索引名称。简写示例如下:特别说明,如果使用@ModelAttribute标记方法,Spring会将方法的返回值绑定到具体的Model。示例如下:在Spring调用具体的处理方法之前,所有被@ModelAttribute注解的方法都会被执行。@CrossOrigin@CrossOrigin注解将为请求处理类或请求处理方法提供跨域调用支持。如果我们给类加上这个注解,类中的所有方法都将获得支持跨域的能力。使用此注释的好处是可以微调跨域行为。使用该注解的示例如下:@InitBinder@InitBinder注解用于标记初始化WebDataBinider的方法,用于处理Http请求传递的表单数据,如时间格式化和字符串处理等待。下面是这个注解的使用示例:2.SpringBean注解本节主要列举了四个与SpringBean相关的注解及其使用方法。@ComponentScan@ComponentScan注解用于配置组件注解所注解的类需要被Spring扫描的包。您可以通过配置其basePackages属性或value属性来配置要扫描的包路径。value属性是basePackages的别名。该注解的用法如下:@Component@Component注解用于标记一个普通的组件类,没有明确的业务范围,只是通知Spring该注解所注解的类需要包含在SpringBean容器中和管理。该注解的使用示例如下:@Service@Service注解是@Component的扩展(特例),用于标记业务逻辑类。和@Component注解一样,被该注解注解的类会被Spring自动管理。下面是使用@Service注解的例子:@Repository@Repository注解也是@Component注解的扩展。和@Component注解一样,被该注解注解的类会被Spring自动管理,@Repository注解用于标记DAO层的数据持久化类。该注解的用法如下:3.SpringDependencyInject和BeanScops注解SpringDI注解@DependsOn@DependsOn注解可以配置SpringIoC容器在初始化一个Bean之前先初始化其他Bean对象.下面是使用该注解的示例代码:@Bean@Bean注解的主要作用是通知Spring,该注解标记的类需要被包含在Bean管理工厂中。@Bean注解的使用非常简单。这里重点介绍@Bean注解中initMethod和destroyMethod的使用。示例如下:Scops注解@Scope@Scope注解可以用来定义@Component标记的类的作用域和@Bean标记的类的作用域。@Scope定义的范围有:singleton,prototype,request,session,globalSession或其他自定义范围。这里我们以prototype为例进行说明。当一个SpringBean被声明为原型(prototypemode)时,SpringIoC容器会在每次需要使用该类时初始化一个被修改类的新实例。定义Bean时,可以设置Bean的scope属性为原型:scope="prototype",或者使用@Scope注解来设置,如下:@Scope(value=ConfigurableBeanFactory.SCOPE_PROPTOTYPE)下面将给出@Scope注解的两种不同使用方式,示例代码如下:@Scope单例模式当设置@Scope的作用域为Singleton时,该注解所标记的类只会被SpringIoC容器初始化一次。默认情况下,SpringIoC容器初始化的类实例都是单例。同样的道理,这种情况下有两种配置方式。示例代码如下:4.容器配置注解@Autowired@Autowired注解用于标记Spring要解析注入的依赖。该注释可以作用于构造函数、字段和设置方法。作用于构造函数下面是使用@Autowired注解标记构造函数的例子:作用于setter方法下面是@Autowired注解标记setter方法的示例代码:作用于字段@Autowired注解是最简单的,只需要在相应的字段中加上这个注解即可。示例代码如下:@Primary当系统中需要配置多个相同类型的bean时,@Primary可以定义这些bean的优先级。下面将给出示例代码来说明此功能:输出:这是发送DingDing方法消息。@PostConstruct和@PreDestroy值得注意的是,这两个注解并不属于Spring,它们是从JSR-250衍生出来的两个注解,位于common-annotations.jar中。@PostConstruct注解用于标记在Bean被Spring初始化之前需要执行的方法。@PreDestroy注解用于标记在Bean被销毁之前需要执行的方法。下面是具体的示例代码:@Qualifier当系统中存在多个相同类型的bean时,@Autowired在进行依赖注入时不知道选择哪个实现类进行注入。此时,我们可以使用@Qualifier注解进行微调,帮助@Autowired选择正确的依赖。下面是关于该注解的代码示例:5.SpringBoot注解@SpringBootApplication@SpringBootApplication注解是一种快速配置注解。在其标记的类中,可以定义一个或多个bean,并自动触发自动配置bean和自动扫描组件。这个注解相当于@Configuration、@EnableAutoConfiguration和@ComponentScan的组合。在SpringBoot应用程序的主类中,使用了这个注解。示例代码如下:@SpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}@EnableAutoConfiguration@EnableAutoConfiguration注解用于通知Spring,根据当前类路径引入的依赖包,自动配置这些依赖包相关的配置项。@ConditionalOnClass和@ConditionalOnMissingClass这两个注解属于类条件注解,它们根据类是否存在来决定是否执行某些配置。下面是一个简单的示例代码:@Configuration@ConditionalOnClass(DataSource.class)classMySQLAutoConfiguration{//...}@ConditionalOnBean和@ConditionalOnMissingBean这两个注解属于对象条件注解,根据对象是否存在来判断是否存在执行某些配置方法。示例代码如下:@Bean@ConditionalOnBean(name="dataSource")LocalContainerEntityManagerFactoryBeanentityManagerFactory(){//...}@Bean@ConditionalOnMissingBeanpublicMyBeanmyBean(){//...}@ConditionalOnProperty@ConditionalOnProperty注解会根据Spring配置文件中的配置项是否满足配置要求,决定是否执行标记的方法。示例代码如下:@Bean@ConditionalOnProperty(name="alipay",havingValue="on")支付宝alipay(){returnnewAlipay();}@ConditionalOnResource该注解用于检测配置文件何时存在并触发其标记的方法,下面是使用该注解的代码示例:@ConditionalOnResource(resources="classpath:website.properties")PropertiesaddWebsiteProperties(){//...}@ConditionalOnWebApplication和@ConditionalOnNotWebApplication这两个注解用来判断当前应用是否为web应用。如果当前应用是Web应用,则使用SpringWebApplicationContext,定义其session的生命周期。下面是一个简单的例子:@ConditionalOnWebApplicationHealthCheckControllerhealthCheckController(){//...}@ConditionalExpression这个注解允许我们控制更细粒度的基于表达式的配置条件限制。当表达式满足某个条件或表达式为真时,将执行该注解标记的方法。@Bean@ConditionalException("${localstore}&&${local=='true'}")LocalFileStorestore(){//...}@Conditional@Conditional注解可以控制更复杂的配置条件。当Spring内置的条件控制注解不满足应用需求时,可以使用该注解定义自定义控制条件,以满足自定义需求。下面是一个使用该注解的简单例子:@Conditioanl(CustomConditioanl.class)CustomPropertiesaddCustomProperties(){//...}总结本课程总结了SpringBoot中常见的各类注解的用法,方便大家统一全面了解SpringBoot常用注解。由于篇幅原因,一些不常用的关于SpringBoot的注解会在下一次分享中补充说明。