SpringBoot-注解
原文:SpringBoot 注解最全详解,建议收藏! (qq.com)
SpringMVC 相关
@Controller
通常用于修饰controller
层的组件,由控制器负责将用户发来的URL
请求转发到对应的服务接口,通常还需要配合注解@RequestMapping
使用。
@RequestMapping
提供路由信息,负责URL
到Controller
中具体函数的映射,当用于方法上时,可以指定请求协议,比如GET
、POST
、PUT
、DELETE
等等。
@RequestBody
表示请求体的Content-Type
必须为application/json
格式的数据,接收到数据之后会自动将数据绑定到Java
对象上去
@ResponseBody
表示该方法的返回结果直接写入HTTP response body
中,返回数据的格式为application/json
比如,请求参数为json
格式,返回参数也为json
格式,示例代码如下:
1 | /** |
@RestController
和@Controller
一样,用于标注控制层组件,不同的地方在于:它是@ResponseBody
和@Controller
的合集,也就是说,在当@RestController
用在类上时,表示当前类里面所有对外暴露的接口方法,返回数据的格式都为application/json
,示范代码如下:
1 |
|
@RequestParam
用于接收请求参数为表单类型的数据,通常用在方法的参数前面,示范代码如下:
1 | /** |
@PathVariable
用于获取请求路径中的参数,通常用于restful
风格的api
上,示范代码如下:
1 | /** |
@GetMapping
除了@RequestMapping
可以指定请求方式之外,还有一些其他的注解,可以用于标注接口路径请求,比如GetMapping
用在方法上时,表示只支持get
请求方法,等价于@RequestMapping(value="/get",method=RequestMethod.GET)
1 |
|
@PostMapping
用在方法上,表示只支持post
方式的请求。
1 |
|
@PutMapping
用在方法上,表示只支持put
方式的请求,通常表示更新某些资源的意思
1 |
|
@DeleteMapping
用在方法上,表示只支持delete
方式的请求,通常表示删除某些资源的意思
1 |
|
Bean 相关
@Primary
当一个接口有多个实现时,我们可以通过@Autowired
注解搭配@Qualifier
来注入我们想要的Bean。这里还有另一种情况:Bean之前分优先级顺序,一般情况下我们只会注入默认实现;这个时候可以采用@Primary
注解,该注解标注于Bean上,指示了优先注入的类
1 |
|
@Service
通常用于修饰service
层的组件,声明一个对象,会将类对象实例化并注入到bean
容器里面
1 |
|
@Component
泛指组件,当组件不好归类的时候,可以使用这个注解进行标注,功能类似于于@Service
1 |
|
@Repository
通常用于修饰dao
层的组件,
@Repository
注解属于Spring
里面最先引入的一批注解,它用于将数据访问层 (DAO
层 ) 的类标识为Spring Bean
,具体只需将该注解标注在 DAO类上即可,示例代码如下:
1 |
|
为什么现在使用的很少呢?
主要是因为当我们配置服务启动自动扫描dao
层包时,Spring
会自动帮我们创建一个实现类,然后注入到bean
容器里面。当某些类无法被扫描到时,我们可以显式的在数据持久类上标注@Repository
注解,Spring
会自动帮我们声明对象。
@Bean
相当于 xml 中配置 Bean,意思是产生一个 bean 对象,并交给spring管理,示例代码如下:
1 |
|
@Bean 执行顺序先于 @Value
@Bean和@Value出现在同一个类中时,@Bean会比@Value先执行,这会导致当@Bean注解的方法中用到@Value注解的成员变量时,变量为null或为默认值的问题
解决:在@Bean方法的参数上使用@Value注入username和password
1 |
|
@DependsOn
1 |
|
@Conditional
从 Spring4 开始,可以通过@Conditional
注解实现按条件装载bean
对象,目前 Spring Boot 源码中大量扩展了@Condition
注解,用于实现智能的自动化配置,满足各种使用场景。下面我给大家列举几个常用的注解:
@ConditionalOnBean
:当某个特定的Bean
存在时,配置生效@ConditionalOnMissingBean
:当某个特定的Bean
不存在时,配置生效@ConditionalOnClass
:当Classpath
里存在指定的类,配置生效@ConditionalOnMissingClass
:当Classpath
里不存在指定的类,配置生效@ConditionalOnExpression
:当给定的SpEL
表达式计算结果为true
,配置生效@ConditionalOnProperty
:当指定的配置属性有一个明确的值并匹配,配置生效
具体的应用案例如下:
1 |
|
@Import
@Import
经常用于 SpringBoot 自动配置机制中,通过这种方式,可以自动注册一些默认的 Bean 实例来简化开发工作
1 |
|
@Autowired
自动导入依赖的bean
对象,默认时按照byType
方式导入对象,而且导入的对象必须存在,当需要导入的对象并不存在时,我们可以通过配置required = false
来关闭强制验证。
1 |
|
@Resource
也是自动导入依赖的bean
对象,由JDK
提供,默认是按照byName
方式导入依赖的对象;而@Autowired
默认时按照byType
方式导入对象,当然@Resource
还可以配置成通过byType
方式导入对象。
1 | /** |
@Qualifier
当有多个同一类型的bean
时,使用@Autowired
导入会报错,提示当前对象并不是唯一,Spring
不知道导入哪个依赖,这个时候,我们可以使用@Qualifier
进行更细粒度的控制,选择其中一个候选者,一般于@Autowired
搭配使用,示例如下:
1 |
|
@Scope
用于声明一个spring bean
的作用域,作用的范围一共有以下几种:
- singleton:唯一 bean 实例,Spring 中的 bean 默认都是单例的。
- prototype:每次请求都会创建一个新的 bean 实例,对象多例。
- request:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
- session:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
1 | /** |
配置相关
@Configuration
表示声明一个 Java 形式的配置类,Spring Boot 提倡基于 Java 的配置,相当于你之前在 xml 中配置 bean,比如声明一个配置类AppConfig
,然后初始化一个Uploader
对象。
1 |
|
@EnableAutoConfiguration
@EnableAutoConfiguration
可以帮助SpringBoot
应用将所有符合条件的@Configuration
配置类,全部都加载到当前SpringBoot
里,并创建对应配置类的Bean
,并把该Bean
实体交给IoC
容器进行管理。
某些场景下,如果我们想要避开某些配置类的扫描(包括避开一些第三方jar
包下面的配置,可以这样处理。
1 |
|
@ComponentScan
标注哪些路径下的类需要被Spring
扫描,用于自动发现和装配一些Bean
对象,默认配置是扫描当前文件夹下和子目录下的所有类,如果我们想指定扫描某些包路径,可以这样处理。
1 |
@SpringBootApplication
等价于使用@Configuration
、@EnableAutoConfiguration
、@ComponentScan
这三个注解,通常用于全局启动类上,示例如下:
1 |
|
把@SpringBootApplication
换成@Configuration
、@EnableAutoConfiguration
、@ComponentScan
这三个注解,一样可以启动成功,@SpringBootApplication
只是将这三个注解进行了简化!
@EnableTransactionManagement
表示开启事务支持,等同于 xml 配置方式的<tx:annotation-driven />
1 |
|
@EnableAsync
开启异步任务支持,方法上配合注解 @Async
,配置项为 spring.task.execution
@EnableScheduling
开启定时任务支持,方法上配合注解 @Scheduled
,配置项为 spring.task.scheduling
@value
可以在任意 Spring 管理的 Bean 中通过这个注解获取任何来源配置的属性值,比如你在application.properties
文件里,定义了一个参数变量!
1 | config.name=zhangsan |
在任意的bean
容器里面,可以通过@Value
注解注入参数,获取参数变量值。
1 |
|
也可以写到方法参数上
1 |
|
@ConfigurationProperties
上面@Value
在每个类中获取属性配置值的做法,其实是不推荐的。
一般在企业项目开发中,不会使用那么杂乱无章的写法而且维护也麻烦,通常会一次性读取一个 Java 配置类,然后在需要使用的地方直接引用这个类就可以多次访问了,方便维护,示例如下:
首先,在application.properties
文件里定义好参数变量。
1 | config.name=demo_1 |
然后,创建一个 Java 配置类,将参数变量注入即可!
1 |
|
最后,在需要使用的地方,通过ioc
注入Config
对象即可!
@PropertySource
这个注解是用来读取我们自定义的配置文件的,比如导入test.properties
和bussiness.properties
两个配置文件,用法如下:
1 |
|
@ImportResource
用来加载 xml 配置文件,比如导入自定义的aaa.xml
文件,用法如下:
1 |
|
异常处理相关
@ControllerAdvice
或 @RestControllerAdvice
+ @ExceptionHandler
通常组合使用,用于处理全局异常。@RestControllerAdvice
相当于 @ControllerAdvice
+ @ResponseBody
示例代码如下:
1 |
|
测试相关
@ActiveProfiles
一般作用于测试类上, 用于声明生效的 Spring 配置文件,比如指定application-dev.properties
配置文件。
@RunWith
和@SpringBootTest
一般作用于测试类上, 用于单元测试用,示例如下:
1 |
|