Spring Boot 注解简单总结(持续补充中)

Spring Boot 最大的特点就是无需XML配置文件,能够自动扫描包路径装载并注入对象,并能够根据classpath下的jar包自动配置。

Spring Boot 三个核心注解

@SpringBootApplication

这是 Spring Boot 最最最核心的注解,用在 Spring Boot 主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。

其实这个注解就是 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 这三个注解的组合,也可以用这三个注解来代替 @SpringBootApplication 注解。

1. @EnableAutoConfiguration

允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。

2. @Configuration

这是 Spring 3.0 添加的一个注解,用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册。它的几个相关的注解也比较重要:

@Bean

用于替代XML配置文件中的<bean …>配置。

@ImportResource

如果有些通过类的注册方式无法配置的,可以通过这个注解引入额外的XML配置文件,有些老的配置文件无法通过@Configuration方式配置的很有效

@Import

用来引入额外一个或者多个@Configuration修饰的配置类文件

@SpringBootConfiguration

就是@Configuration在Spring Boot中的另一种叫法

3. @ComponentScan

这是 Spring 3.1 添加的一个注解,用来代替配置文件中的 component-scan 配置,开启组件扫描,即自动扫描包路径下的 @Component 注解进行注册 bean 实例到 context 中。

其他注解

@ConfigurationProperties

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

@EnableConfigurationProperties

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

@AutoConfigureAfter

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

如 Mybatis 的自动配置类,需要在数据源自动配置类之后。

1
2
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisAutoConfiguration {

@AutoConfigureBefore

这个和 @AutoConfigureAfter 注解使用相反,表示该自动配置类需要在另外指定的自动配置类配置之前。

@RestController

是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。

@Autowired

自动导入。

@PathVariable

获取参数。

@JsonBackReference

jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore均是为了解决对象中存在双向引用导致的无限递归(infinite recursion)问题。这些标注均可用在属性或对应的get、set方法中。

@JsonBackReference和@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。@JsonBackReference标注的属性在序列化(serialization,即将对象转换为json数据)时,会被忽略(即结果中的json数据不包含该属性的内容)。@JsonManagedReference标注的属性则会被序列化。在序列化时,@JsonBackReference的作用相当于@JsonIgnore,此时可以没有@JsonManagedReference。但在反序列化(deserialization,即json数据转换为对象)时,如果没有@JsonManagedReference,则不会自动注入@JsonBackReference标注的属性(被忽略的父或子);如果有@JsonManagedReference,则会自动注入自动注入@JsonBackReference标注的属性。

@RepositoryRestResourcepublic

配合spring-boot-starter-data-rest使用。

@ResponseBody

表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,用于构建RESTful的api。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用。

@Controller

用于定义控制器类,在spring 项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping。

@RestController

用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集

@RequestMapping

提供路由信息,负责URL到Controller中的具体函数的映射。

@Repository

使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。

@Value

注入Spring boot application.properties配置的属性的值。示例代码:

@Value(value = “#{message}”)
private String message;

@Inject

等价于默认的@Autowired,只是没有required属性;

@Component

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@AutoWired

自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。

@Qualifier

当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者,具体使用方式如下:
@Autowired
@Qualifier(value = “demoInfoService”)
private DemoInfoService demoInfoService;

@RequestMapping

@RequestMapping(“/path”)表示该控制器处理所有“/path”的UR L请求。RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。该注解有六个属性:
params:指定request中必须包含某些参数值是,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
value:指定请求的实际地址,指定的地址可以是URI Template 模式
method:指定请求的method类型, GET、POST、PUT、DELETE等
consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html;
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

@RequestParam

用在方法的参数前面。
@RequestParam
String a =request.getParameter(“a”)。

@PathVariable

路径变量。如
RequestMapping(“user/get/mac/{macAddress}”)
public String getByMacAddress(@PathVariable String macAddress){
//do something;

@ControllerAdvice

包含@Component。可以被扫描到。统一处理异常。

@ExceptionHandler(Exception.class)

用在方法上面表示遇到这个异常就执行以下方法。

@Resource(name=”name”,type=”type”)

没有括号内内容的话,默认byName。与@Autowired干类似的事。

@Scope

描述的是Spring容器如何创建Bean的实例的,它有几种不同可能的取值:

  1. Singleton:一个Spring容器只能有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例
  2. Prototype:每次调用新建一个Bean的实例
  3. Request:Web项目中,给每一个http request新建一个Bean实例
  4. Session:Web项目中,给每一个http Session新建一个Bean实例
  5. GlobalSesion:这个只在portal应用中有用,给每一个global http session 新建一个Bean实例。

@PostConstruct

增加JSR250支持后,该注解修饰的方法会在构造函数执行完成之后执行

@PreDestroy

增加JSR250支持后,该注解修饰的方法会在Bean销毁之前执行

元注解

元注解就是注解的注解,包括@Retention,@Target,@Document,@Inherited

@Retention

@Retention(RetentionPolicy.SOURCE):注解仅存在于源码中,在class字节码文件中不包含

@Retention(RetentionPolicy.CLASS):默认的保留策略,注解会在class字节码文件中存在,但运行时无法获取

@Retention(RetentionPolicy.RUNTIME):注解会在class字节码文件中存在,运行时可以通过反射获得

@Target:定义注解的目标

@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包

@Documented

表明该注解会被包含在javadoc中

@Inherited

子类可以继承父类中的该注解

举例说明

我们可以通过上述几个注解定义一个新的注解,如

1
2
3
4
5
6
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {
String name;
}

这样我们就定义了一个叫做Action的新注解,它有一个叫做name的属性

Spring多线程相关

spring通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
@ComponentScan("com.wisely.highlight")
@EnableAsync
public class TaskExecutorConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor () {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapcity(25);
taskExecutor.initialize();
return taskExecutor;
}
}

通过上述配置类,则在"com.wisely.highlight"包下的所有被@Async修饰的类或者方法都是异步的。

Spring计划任务

首先在配置类注解@EnableScheduling来开启对计划任务的支持,然后在要执行计划任务的方法上注解@Scheduled,声明这是一个计划任务。

通过@Scheduled支持的计划任务分为多种,包括corn,fixDelay,fixRate等

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.wisely.highlight
@Service
public class ScheduledTaskService {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

@Scheduled(fixedRate = 5000) //每隔五秒执行一次
public void reportCurrentTime () {

}

@Scheduled(corn = "0 25 11 ? * *") //定时任务,每条11点28分执行
public void fixTimeExecution () {

}
}

可以通过@EnableScheduling来开启对计划任务的支持

1
2
3
4
5
6
@Configuration
@ComponentScan("com.wisely.highlight")
@EnableScheduling
public class TaskSchedulerConfig {

}

这样所有com.wisely.highlight包下面所有的类都会开启对于计划任务的支持

执行

1
2
3
4
5
public class Main {
public static void main (String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigAoolicationContext (TaskSchedulerConfig.class)
}
}

参考文章

https://zhuanlan.zhihu.com/p/57689422

https://blog.csdn.net/zsq520520/article/details/55261359

https://blog.csdn.net/qq_35357001/article/details/55505659

ExceptionHandler使用法简介