Java开发者已经事实上离不开Spring。本文尝试总结一下,工作中用到的注解。
主要有Spring Bean与Spring Web MVC,及其他等3类注解。这种分类不太科学,理解即可。
常用的Bean的配置元数据:@Lazy,@DependsOn,@Scope,@Qualifier,@Primary。
告知Spring,被此注解所标注的类将需要纳入到Bean管理工厂中,有两个核心方法:initMethod和destroyMethod。
自动装配,用于标记Spring将要解析和注入的依赖项。可用于构造函数、字段和setter方法上。
限定描述符,用于按类型自动装配时有多个同类型的bean时,规定选择某一个特定名称的bean;当系统中存在同一类型的多个Bean时,@Autowired在进行依赖注入的时候就不知道该选择哪一个实现类进行注入。此时可使用@Qualifier注解来微调,帮助@Autowired选择正确的依赖项。
用于标注一个普通的组件类,它没有明确的业务范围,只是通知Spring被此注解的类需要被纳入到Spring Bean容器中并进行管理。初始化bean的名字默认是类名第一个字母小写。@Component的扩展注解(即源码中引入@Component):
用于配置Spring需要扫描的被组件注解注释的类所在的包。可以通过配置其basePackages属性或者value属性来配置需要扫描的包路径。value属性是basePackages的别名
@Lazy(false):延迟初始化
自动装配时当出现多个Bean候选者时,将作为首选者;当系统中需要配置多个具有相同类型的bean时,@Primary可以定义这些Bean的优先级。
可以配置Spring IoC容器在初始化一个Bean之前,先初始化其他的Bean对象;可决定Bean初始化及销毁时的顺序
用于修改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
这两个注解不属于Spring,源于JSR-250中的两个注解,位于common-annotations.jar中。
@PostConstruct:用于标注在Bean被Spring初始化之前需要执行的方法,等同于XML配置的init-method
;
@PreDestroy:用于标注Bean被销毁前需要执行的方法,等同于XML配置的destroy-method
。
和MVC相关的一些注解
@Component的一个延伸,Spring会自动扫描并配置被该注解标注的类。此注解用于标注Spring MVC的控制器。
在Spring 4.0开始引入的,这是一个特定的控制器注解。此注解相当于@Controller和@ResponseBody的组合。当使用此注解时,不需要再在方法上使用@ResponseBody注解。
可用于Controller类和方法,Spring MVC和Spring WebFlux都通过RquestMappingHandlerMapping和RequestMappingHndlerAdapter两个类来提供对@RequestMapping注解的支持。
@RequestMapping注解对请求处理类中的请求处理方法进行标注;@RequestMapping注解拥有以下的六个配置属性:
提示:在使用@RequestMapping之前,请求处理类还需要使用@Controller或@RestController进行标记
在处理请求方法的参数列表中使用,它可以将请求主体中的参数绑定到一个对象中,请求主体参数是通过HttpMessageConverter传递的,根据请求主体中的参数名与对象的属性名进行匹配并绑定值。此外,还可以通过@Valid注解对请求主体中的参数进行校验。
会自动将控制器中方法的返回值写入到HTTP响应中。特别的,@ResponseBody注解只能用在被@Controller注解标记的类中。如果在被@RestController标记的类中,则方法不需要使用@ResponseBody注解进行标注。@RestController相当于是@Controller和@ResponseBody的组合注解。
可通过模型索引名称来访问已经存在于控制器中的model。如果使用@ModelAttribute对方法进行标注,Spring会将方法的返回值绑定到具体的Model上。在Spring调用具体的处理方法之前,被@ModelAttribute注解标注的所有方法都将被执行。
与@RequestBody区别??
在@RequestMapping(method=RequestMethod.xxx)里面指定请求支持的方法:
将方法中的参数绑定到请求URI中的模板变量上。可以通过@RequestMapping注解来指定URI的模板变量,然后使用@PathVariable注解将方法中的参数绑定到模板变量上。允许我们使用value或name属性来给参数取一个别名。
用于将方法的参数与Web请求的传递的参数进行绑定。使用@RequestParam可以轻松的访问HTTP请求参数的值。
@ControllerAdvice,@Component的一个延伸注解,Spring会自动扫描并检测被@ControllerAdvice所标注的类。@ControllerAdvice需要和@ExceptionHandler、@InitBinder以及@ModelAttribute注解搭配使用,主要是用来处理控制器所抛出的异常信息。
首先,需要定义一个被@ControllerAdvice所标注的类,在该类中,定义一个用于处理具体异常的方法,并使用@ExceptionHandler注解进行标记。
此外,在有必要时,可以使用@InitBinder在类中进行全局的配置,还可以使用@ModelAttribute配置与视图相关的参数。使用@ControllerAdvice注解,就可以快速的创建统一的,自定义的异常处理类。
@ExceptionHander
用于标注处理特定类型异常类所抛出异常的方法。当控制器中的方法抛出异常时,Spring会自动捕获异常,并将捕获的异常信息传递给被@ExceptionHandler标注的方法。
@ResponseStatus
可以标注请求处理方法。使用此注解,可以指定响应所需要的HTTP STATUS。特别地,可以使用HttpStauts类对该注解的value属性进行赋值。
将为请求处理类或请求处理方法提供跨域调用支持。如果我们将此注解标注类,那么类中的所有方法都将获得支持跨域的能力。使用此注解的好处是可以微调跨域行为。
用于标注初始化WebDataBinider的方法,该方法用于对Http请求传递的表单数据进行处理,如时间格式化、字符串处理等。
这些注解主要用来开启对xxx的支持:
@RunWith:运行器,Spring中通常用于对JUnit的支持
@ContextConfiguration:用来加载配置ApplicationContext,其中classes属性用来加载配置类
来申明这是一个定时调度执行的任务,包括cron,fixDelay,fixRate等类型,用于方法上,需先开启计划任务的支持(@EnableScheduling)
注入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;
前者开启注解式事务。面试必问。参考
后者用于配置事务的回调方法,可以在事务提交前、提交后、完成后以及回滚后几个阶段接受回调事件。
通过设定Environment的ActiveProfiles来设定当前context需要使用的配置环境,用于类或方法上
在实际执行的bean方法使用该注解来申明其是一个异步任务(方法上或类上所有的方法都将异步,需要@EnableAsync开启异步任务)
@ManagedBean注解及自定义扩展:@ManagedBean注解,需要在应用服务器环境使用(如Jboss),自定义扩展部分是为了配合Spring自带的模式注解扩展自定义的,并不包含在Java EE 6规范中,在Java EE 6中相应的服务层、DAO层功能由EJB来完成。
@Named:注解及自定义扩展,可用于类型、字段、方法参数
参考博客:http://jinnianshilongnian.iteye.com/blog/1461055
注解自动化配置合适的缓存管理器。
开启spring security的功能,集成websercrityconfigureadapter。
Spring 3.0引入,用来导入一个或多个 @Configuration 注解修饰的类。
Spring 3.0引入,用来导入一个或多个 Spring 配置文件,这对 Spring Boot 兼容老项目非常有用,因为有些配置无法通过 Java Config 的形式来配置就只能用这个注解来导入。
快捷配置注解,用于类;可以定义一个或多个Bean,并自动触发自动配置Bean和自动扫描组件。相当于@Configuration、@EnableAutoConfiguration和@ComponentScan的组合。
用于通知Spring,根据当前类路径下引入的依赖包,自动配置与这些依赖包相关的配置项。
@Configuration 注解的变体,只是用来修饰是 Spring Boot 配置而已,或可利于 Spring Boot 后续的扩展。
用来加载额外的配置(如 .properties 文件),可用在 @Configuration 注解类,或者 @Bean 注解方法上面。
一般要配合 @ConfigurationProperties 注解使用,用来开启对 @ConfigurationProperties 注解配置 Bean 的支持。
用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后。
如 Mybatis 的自动配置类,需要在数据源自动配置类之后。
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {
}
AutoConfigureBefore表示该自动配置类需要在另外指定的自动配置类配置之前。
在依赖spring-boot-autoconfigure
里面org.springframework.boot.autoconfigure.condition
包路径下面的若干个注解(未全部列举):
spring-context
依赖中提供的注解。@SpringCloudApplication,快捷的配置注解,用于类;
注解 | 解释 |
---|---|
@EnableDiscoveryclient | 注册应用为Eureka客户端应用,以获得服务发现的能力 |
@EnableAdminServer | 使用admin监控应用 |
@EnableEurekaClient | 配置本应用将使用服务注册和服务发现,注意:注册和发现用这个注解。 |
@EnableEurekaServer | 启动一个服务注册中心 |
@EnableHystrix | 表示启动断路器,断路器依赖于服务注册和发现。 |
@HystrixCommand | 注解方法失败后,系统将西东切换到fallbackMethod方法执行。指定回调方法 |
@FeignClient | 注解中的fallbank属性指定回调类 |
@LoadBalanced | 开启客户端负载均衡 |
@EnableFeignClients | 开启Spring Cloud Feign的支持 |
@EnableCircuitBreaker | 开启断路器功能 |
@RibbonClient | 用来为负载均衡客户端做一些自定义的配置,可以进一步配置或自定义从哪里获取服务端列表、负载均衡策略、Ping也就是服务鉴活策略等 |
@RefreshScope
如果代码中需要动态刷新配置,在需要的类上加上该注解就行。但某些复杂的注入场景下,这个注解使用不当,配置可能仍然不动态刷新;
40个SpringBoot常用注解