Spring系列之Spring(Boot/Cloud)常用注解(最全面)

概述

Java开发者已经事实上离不开Spring。本文尝试总结一下,工作中用到的注解。

Spring

主要有Spring Bean与Spring Web MVC,及其他等3类注解。这种分类不太科学,理解即可。

Spring Bean

常用的Bean的配置元数据:@Lazy,@DependsOn,@Scope,@Qualifier,@Primary。

@Bean

告知Spring,被此注解所标注的类将需要纳入到Bean管理工厂中,有两个核心方法:initMethod和destroyMethod。

@Autowired

自动装配,用于标记Spring将要解析和注入的依赖项。可用于构造函数、字段和setter方法上。

@Qualifier

限定描述符,用于按类型自动装配时有多个同类型的bean时,规定选择某一个特定名称的bean;当系统中存在同一类型的多个Bean时,@Autowired在进行依赖注入的时候就不知道该选择哪一个实现类进行注入。此时可使用@Qualifier注解来微调,帮助@Autowired选择正确的依赖项。

@Component

用于标注一个普通的组件类,它没有明确的业务范围,只是通知Spring被此注解的类需要被纳入到Spring Bean容器中并进行管理。初始化bean的名字默认是类名第一个字母小写。@Component的扩展注解(即源码中引入@Component):

  • @Service:业务逻辑层
  • @Repository:数据访问层
  • @Controller:访问接口层

@ComponentScan

用于配置Spring需要扫描的被组件注解注释的类所在的包。可以通过配置其basePackages属性或者value属性来配置需要扫描的包路径。value属性是basePackages的别名

@Lazy(false)

@Lazy(false):延迟初始化

@Primary

自动装配时当出现多个Bean候选者时,将作为首选者;当系统中需要配置多个具有相同类型的bean时,@Primary可以定义这些Bean的优先级。

@DependsOn

可以配置Spring IoC容器在初始化一个Bean之前,先初始化其他的Bean对象;可决定Bean初始化及销毁时的顺序

@Scope

用于修改bean的scope,默认单例singleton,可用来定义@Component标注的类的作用范围及@Bean所标记的的作用范围。@Scope所限定的作用范围有:singleton、prototype、request、session、globalSession或其他的自定义范围。

当一个Spring Bean被声明为prototype(原型模式)时,在每次需要使用到该类的时候,Spring IoC容器都会初始化一个新的改类的实例。在定义一个Bean时,可以设置Bean的scope属性为prototype:scope="prototype"也可以使用@Scope注解设置:@Scope(value=ConfigurableBeanFactory.SCOPE_PROPTOTYPE),当@Scope的作用范围设置成Singleton时,被此注解所标注的类只会被Spring IoC容器初始化一次。在默认情况下,Spring IoC容器所初始化的类实例都为singleton

@PreDestroy和@PostConstruct

这两个注解不属于Spring,源于JSR-250中的两个注解,位于common-annotations.jar中。
@PostConstruct:用于标注在Bean被Spring初始化之前需要执行的方法,等同于XML配置的init-method
@PreDestroy:用于标注Bean被销毁前需要执行的方法,等同于XML配置的destroy-method

Spring Web MVC

和MVC相关的一些注解

@Controller

@Component的一个延伸,Spring会自动扫描并配置被该注解标注的类。此注解用于标注Spring MVC的控制器。

@RestController

在Spring 4.0开始引入的,这是一个特定的控制器注解。此注解相当于@Controller和@ResponseBody的组合。当使用此注解时,不需要再在方法上使用@ResponseBody注解。

@RequestMapping

可用于Controller类和方法,Spring MVC和Spring WebFlux都通过RquestMappingHandlerMapping和RequestMappingHndlerAdapter两个类来提供对@RequestMapping注解的支持。

@RequestMapping注解对请求处理类中的请求处理方法进行标注;@RequestMapping注解拥有以下的六个配置属性:

  • value:映射的请求URL或者其别名
  • method:兼容HTTP的方法名
  • params:根据HTTP参数的存在、缺省或值对请求进行过滤
  • header:根据HTTP Header的存在、缺省或值对请求进行过滤
  • consume:设定在HTTP请求正文中允许使用的媒体类型
  • product:在HTTP响应体中允许使用的媒体类型

提示:在使用@RequestMapping之前,请求处理类还需要使用@Controller或@RestController进行标记

@RequestBod

在处理请求方法的参数列表中使用,它可以将请求主体中的参数绑定到一个对象中,请求主体参数是通过HttpMessageConverter传递的,根据请求主体中的参数名与对象的属性名进行匹配并绑定值。此外,还可以通过@Valid注解对请求主体中的参数进行校验。

@ResponseBody

会自动将控制器中方法的返回值写入到HTTP响应中。特别的,@ResponseBody注解只能用在被@Controller注解标记的类中。如果在被@RestController标记的类中,则方法不需要使用@ResponseBody注解进行标注。@RestController相当于是@Controller和@ResponseBody的组合注解。

@ModelAttribute

可通过模型索引名称来访问已经存在于控制器中的model。如果使用@ModelAttribute对方法进行标注,Spring会将方法的返回值绑定到具体的Model上。在Spring调用具体的处理方法之前,被@ModelAttribute注解标注的所有方法都将被执行。
与@RequestBody区别??

@xxxMapping

在@RequestMapping(method=RequestMethod.xxx)里面指定请求支持的方法:

  • @GetMapping,相当于是@RequestMapping(method=RequestMethod.GET)
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

@PathVariable

将方法中的参数绑定到请求URI中的模板变量上。可以通过@RequestMapping注解来指定URI的模板变量,然后使用@PathVariable注解将方法中的参数绑定到模板变量上。允许我们使用value或name属性来给参数取一个别名。

@RequestParam

用于将方法的参数与Web请求的传递的参数进行绑定。使用@RequestParam可以轻松的访问HTTP请求参数的值。

全局异常处理

@ControllerAdvice,@Component的一个延伸注解,Spring会自动扫描并检测被@ControllerAdvice所标注的类。@ControllerAdvice需要和@ExceptionHandler、@InitBinder以及@ModelAttribute注解搭配使用,主要是用来处理控制器所抛出的异常信息。

首先,需要定义一个被@ControllerAdvice所标注的类,在该类中,定义一个用于处理具体异常的方法,并使用@ExceptionHandler注解进行标记。

此外,在有必要时,可以使用@InitBinder在类中进行全局的配置,还可以使用@ModelAttribute配置与视图相关的参数。使用@ControllerAdvice注解,就可以快速的创建统一的,自定义的异常处理类。

@ExceptionHander
用于标注处理特定类型异常类所抛出异常的方法。当控制器中的方法抛出异常时,Spring会自动捕获异常,并将捕获的异常信息传递给被@ExceptionHandler标注的方法。

@ResponseStatus
可以标注请求处理方法。使用此注解,可以指定响应所需要的HTTP STATUS。特别地,可以使用HttpStauts类对该注解的value属性进行赋值。

@CrossOrigin

将为请求处理类或请求处理方法提供跨域调用支持。如果我们将此注解标注类,那么类中的所有方法都将获得支持跨域的能力。使用此注解的好处是可以微调跨域行为。

@InitBinder

用于标注初始化WebDataBinider的方法,该方法用于对Http请求传递的表单数据进行处理,如时间格式化、字符串处理等。

@Enable

这些注解主要用来开启对xxx的支持:

  • @EnableAspectJAutoProxy:开启对AspectJ自动代理的支持
  • @EnableAsync:开启异步方法的支持
  • @EnableScheduling:开启计划任务的支持
  • @EnableWebMvc:开启Web MVC的配置支持
  • @EnableConfigurationProperties:开启对@ConfigurationProperties注解配置Bean的支持
  • @EnableJpaRepositories:开启对SpringData JPA Repository的支持
  • @EnableTransactionManagement:开启注解式事务的支持
  • @EnableCaching:开启注解式的缓存支持

测试

@RunWith:运行器,Spring中通常用于对JUnit的支持
@ContextConfiguration:用来加载配置ApplicationContext,其中classes属性用来加载配置类

其他

@Scheduled

来申明这是一个定时调度执行的任务,包括cron,fixDelay,fixRate等类型,用于方法上,需先开启计划任务的支持(@EnableScheduling)

@Value

注入SpEL表达式,可用于字段或方法参数上

@Value(value = "#{'Hello Spring!!!'[0]}")
private String myName;
@Value("#{@systemProperties}")
private Properties pros;
@Value("#{1==1 ? true : false}")
private Boolean b1;
@Value("#{'no'}")
private Boolean b2;
@Value("#{'on'}")
private Boolean b3;
@Value("#{ new double[]{100,44,3.1415,0.4432} }")
private Double[] nums;

@Transactional与TransactionalEventListener

前者开启注解式事务。面试必问。参考
后者用于配置事务的回调方法,可以在事务提交前、提交后、完成后以及回滚后几个阶段接受回调事件。

@Profile

通过设定Environment的ActiveProfiles来设定当前context需要使用的配置环境,用于类或方法上

@Async

在实际执行的bean方法使用该注解来申明其是一个异步任务(方法上或类上所有的方法都将异步,需要@EnableAsync开启异步任务)

@ManagedBean

@ManagedBean注解及自定义扩展:@ManagedBean注解,需要在应用服务器环境使用(如Jboss),自定义扩展部分是为了配合Spring自带的模式注解扩展自定义的,并不包含在Java EE 6规范中,在Java EE 6中相应的服务层、DAO层功能由EJB来完成。
@Named:注解及自定义扩展,可用于类型、字段、方法参数

参考博客:http://jinnianshilongnian.iteye.com/blog/1461055

@Configuration

@EnableCaching

注解自动化配置合适的缓存管理器。

@EnableWebSecurity

开启spring security的功能,集成websercrityconfigureadapter。

@Import

Spring 3.0引入,用来导入一个或多个 @Configuration 注解修饰的类。

@ImportResource

Spring 3.0引入,用来导入一个或多个 Spring 配置文件,这对 Spring Boot 兼容老项目非常有用,因为有些配置无法通过 Java Config 的形式来配置就只能用这个注解来导入。

Spring Boot

@SpringBootApplication

快捷配置注解,用于类;可以定义一个或多个Bean,并自动触发自动配置Bean和自动扫描组件。相当于@Configuration、@EnableAutoConfiguration和@ComponentScan的组合。

@EnableAutoConfiguration

用于通知Spring,根据当前类路径下引入的依赖包,自动配置与这些依赖包相关的配置项。

@SpringBootConfiguration

@Configuration 注解的变体,只是用来修饰是 Spring Boot 配置而已,或可利于 Spring Boot 后续的扩展。

@ConfigurationProperties

用来加载额外的配置(如 .properties 文件),可用在 @Configuration 注解类,或者 @Bean 注解方法上面。

@EnableConfigurationProperties

一般要配合 @ConfigurationProperties 注解使用,用来开启对 @ConfigurationProperties 注解配置 Bean 的支持。

@AutoConfigureAfter与@AutoConfigureBefore

用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后。
如 Mybatis 的自动配置类,需要在数据源自动配置类之后。

@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
}

AutoConfigureBefore表示该自动配置类需要在另外指定的自动配置类配置之前。

条件注解

在依赖spring-boot-autoconfigure里面org.springframework.boot.autoconfigure.condition包路径下面的若干个注解(未全部列举):

  • @ConditionalOnClass与@ConditionalOnMissingClass:类条件注解,根据是否存在某个类作为判断依据来决定是否要执行某些配置
  • @ConditionalOnBean与@ConditionalOnMissingBean:对象条件注解,根据是否存在某个对象作为依据来决定是否要执行某些配置方法
  • @ConditionalOnProperty:根据Spring配置文件中的配置项是否满足配置要求,从而决定是否要执行被其标注的方法
  • @ConditionalOnResource:用于检测当某个配置文件存在使,则触发被其标注的方法
  • @ConditionalOnWebApplication与@ConditionalOnNotWebApplication:用于判断当前的应用程序是否是Web应用程序。如果当前应用是Web应用程序,则使用Spring WebApplicationContext,并定义其会话的生命周期
  • @ConditionalExpression:控制更细粒度的基于表达式的配置条件限制。当表达式满足某个条件或表达式为真时,将会执行被此注解标注的方法
  • @Conditional:可用于控制更为复杂的配置条件。在Spring内置的条件控制注解不满足应用需求时,可使用此注解定义自定义的控制条件,以达到自定义的要求。实际上是spring-context依赖中提供的注解。

Spring Cloud

@SpringCloudApplication,快捷的配置注解,用于类;

注解 解释
@EnableDiscoveryclient 注册应用为Eureka客户端应用,以获得服务发现的能力
@EnableAdminServer 使用admin监控应用
@EnableEurekaClient 配置本应用将使用服务注册和服务发现,注意:注册和发现用这个注解。
@EnableEurekaServer 启动一个服务注册中心
@EnableHystrix 表示启动断路器,断路器依赖于服务注册和发现。
@HystrixCommand 注解方法失败后,系统将西东切换到fallbackMethod方法执行。指定回调方法
@FeignClient 注解中的fallbank属性指定回调类
@LoadBalanced 开启客户端负载均衡
@EnableFeignClients 开启Spring Cloud Feign的支持
@EnableCircuitBreaker 开启断路器功能
@RibbonClient 用来为负载均衡客户端做一些自定义的配置,可以进一步配置或自定义从哪里获取服务端列表、负载均衡策略、Ping也就是服务鉴活策略等

Spring Data JPA

@RefreshScope
如果代码中需要动态刷新配置,在需要的类上加上该注解就行。但某些复杂的注入场景下,这个注解使用不当,配置可能仍然不动态刷新;

参考

40个SpringBoot常用注解

你可能感兴趣的:(Spring,spring)