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