Spring Boot常用注解
一、MVC相关注解
1、控制层常用注解
@Controller
用于定义控制层类,该类主要负责将用户发来的URL请求转发到对应的服务接口(service层),一般在类中通常需要配合注解
@RequestMapping
使用
@Controller
是@Component
注解的一个延伸,会自动将该类注册到spring容器中。
如果直接返回的是String,则会跳转到jsp、ftl、html等模版页面. 如果想返回json数据,则在方法上加
@ResponseBody
注解.
@Controller
public class DemoController {
@GetMapping("home")
public String demo() {
return "home";
}
}
@RestController
@RestController
是在Spring 4.0开始引入的,这是一个特定的控制器注解。该注解想当于@Controller
和@ResponseBody
两个注解同时使用。
@RestController("test")
public class TestController {
@GetMapping("test1")
public String demo(){
return "hello world";
}
}
@RequestMapping
MVC与WebFlux都通过RquestMappingHandlerMapping
和RequestMappingHndlerAdapter
两个类来提供对@RequestMapping注解的支持。
@RequestMapping
注解对请求处理类中的请求处理方法进行标注;
value
:映射的请求URL或者其别名method
:兼容HTTP的方法名params
:根据HTTP参数的存在、缺省或值对请求进行过滤header
:根据HTTP Header的存在、缺省或值对请求进行过滤consume
:设定在HTTP请求正文中允许使用的媒体类型product
:在HTTP响应体中允许使用的媒体类型
在使用@RequestMapping之前,请求处理类还需要使用@Controller或@RestController进行标记
@RestController("test")
public class TestController {
// @GetMapping("test1")
@RequestMapping(value = "test1",method = RequestMethod.GET)
public String demo(){
return "hello world";
}
}
@GetMapping("test1")等同于@RequestMapping(value = "test1",method = RequestMethod.GET)
@RequestBody
@RequestBody在处理请求方法的参数列表中使用,它可以将请求主体中的参数绑定到一个对象中,请求主体参数是通过HttpMessageConverter
传递的,根据请求主体中的参数名与对象的属性名进行匹配并绑定值。
// @PostMapping("test1")
@RequestMapping(value = "test1",method = RequestMethod.POST)
public User demo(@Validated @RequestBody User user, BindingResult result){
log.info("user:{}",user);
return user;
}
- @Valid对请求主体中的参数进行校验
- result参数获取Valid的校验结果
@GetMapping
一般用于数据的获取
@GetMapping
用于处理GET请求,并将请求映射到具体的处理方法中。@GetMapping
是一个组合注解,它相当于是@RequestMapping(method=RequestMethod.GET)
的方式。
@PostMapping
一般用于数据的添加
@PostMapping
用于处理POST请求,并将请求映射到具体的处理方法中。@PostMapping
是一个组合注解,它相当于是@RequestMapping(method=HttpMethod.POST)
的方式。
@PutMapping
一般用于数据的更新,该注解的作用等同于PostMapping
@PutMapping
用于处理PUT请求,并将请求映射到具体的处理方法中。@PutMapping
是一个组合注解,相当于是@RequestMapping(method=HttpMethod.PUT)
的方式。
@DeleteMapping
一般用于数据的删除
@DeleteMapping
用于处理DELETE请求,并将请求映射到删除方法中。@DeleteMapping
是一个组合注解,相当于是@RequestMapping(method=HttpMethod.DELETE)
的方式。
@PatchMapping
@PatchMapping
用于处理PATCH请求,并将请求映射到对应的处理方法中。
@PatchMapping
相当于是@RequestMapping(method=HttpMethod.PATCH)
的方式。
@PathVariable
@PathVariable
是将方法中的参数绑定到请求URI中的模板变量上。可以通过@RequestMapping
注解来指定URI的模板变量,然后使用@PathVariable
注解将方法中的参数绑定到模板变量上。
@PathVariable
注解允许我们使用value或name属性来给参数取一个别名。
@RestController("test")
@RequiredArgsConstructor
public class TestController {
private UserService userService;
@GetMapping("user/{userId}")
public User demo(@PathVariable("userId")Long userId){
return userService.findById(userId);
}
}
模板变量名需要使用
{}
进行包裹,如果方法的参数名与URI模板变量名一致,则在@PathVariable
中就可以省略别名的定义。 如果参数是一个非必须的,可选的项,则可以在@PathVariable
中设置require = false
@RequestParam
@RequestParam
用于将方法的参数与Web请求的传递的参数进行绑定。
@RestController("test")
@RequiredArgsConstructor
public class TestController {
private UserService userService;
@GetMapping("user/name")
public User demo(@RequestParam(value = "name",defaultValue = "张三")String name){
return userService.findByName(name);
}
}
该注解的其他属性配置与
@PathVariable
的配置相同 如果传递的参数为空,还可以通过defaultValue设置一个默认值,如上面代码就给name赋予了一个默认值张三。
@ResponseBody
@ResponseBody
表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,用于构建RESTful的api。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@esponsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@Responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用。
@Controller
@RequestMapping("/temp")
public class TempController {
@ResponseBody
@GetMapping("/home")
public String home(){
return "home";
}
}
@ResponseBody
注解只能用在被@Controller
注解标记的类中。如果在被@RestController
标记的类中,则方法不需要使用@ResponseBody
注解进行标注。
2、增强Controller
@ControllerAdvice
*@ControllerAdvice*
这是一个增强的 Controller,可以实现这三方面的功能
- 全局异常处理
- 全局数据绑定
- 全局数据预处理
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Result exceptionHandler(Exception e) {
log.error(ExceptionUtils.toString(e));
return Result.error("内部服务出错了", e.getMessage());
}
}
@ExceptionHandler
@ExceptionHander
用于标注处理特定类型异常类所抛出异常的方法。当控制器中的方法抛出异常时,Spring会自动捕获异常,并将捕获的异常信息传递给被@ExceptionHandler
标注的方法。
@ResponseStatus
@ResponseStatus
注解可以标注请求处理方法。使用此注解,可以指定响应所需要的HTTP STATUS。特别地,我们可以使用HttpStauts类对该注解的value属性进行赋值。
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
public Result noHandlerFoundExceptionHandler(NoHandlerFoundException e) {
log.error("请求的url:{},错误的原因为:找不到该请求的方法", getRequestURI());
return Result.error("找不到请求的方法:{}", e.getRequestURL());
}
}
@InitBinder
@InitBinder
用于标注初始化WebDataBinider的方法,该方法用于对Http请求传递的表单数据进行处理,如时间格式化、字符串处理等。下面是使用此注解的示例:
@ControllerAdvice
public class InitBinderAdviseController {
@InitBinder
public void dateTypeBinder(WebDataBinder webDataBinder){
webDataBinder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
}
3、其他
@CrossOrigin
@CrossOrigin
注解将为请求处理类或请求处理方法提供跨域调用支持。如果我们将此注解标注类,那么类中的所有方法都将获得支持跨域的能力。使用此注解的好处是可以微调跨域行为。使用此注解的示例如下:
二、Spring Bean 注解
@ComponentScan
@ComponentScan
用于配置Spring需要扫描的被组件注解注释的类所在的包。可以通过配置其basePackages属性或者value属性来配置需要扫描的包路径。value属性是basePackages的别名。
个人理解相当于,如果扫描到有@Component、@Controller、@Service等这些注解的类,并注册为Bean,可以自动收集所有的Spring组件,包括@Configuration类。我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。可以自动收集所有的Spring组件,包括@Configuration类。我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。 如果没有配置的话,Spring Boot会扫描启动类所在包下以及子包下的使用了@Service,@Repository等注解的类。 |
@ComponentScan({"top.andoudou.demo1","top.andoudou.demo2"})
@Component
@Component用于标注一个普通的组件类,它没有明确的业务范围,只是通知Spring被此注解的类需要被纳入到Spring Bean容器中并进行管理。此注解的使用示例如下:
@Component
@Slf4j
public class LogCollectorExecutorConfiguration implements AsyncConfigurer {
}
@Service
@Service
注解是@Component
的一个延伸(特例),它用于标注业务逻辑类。与@Component
注解一样,被此注解标注的类,会自动被Spring所管理。
@Service
@Slf4j
public class CallbackMsgServiceImpl implements CallbackMsgService{
}
@Repository
@Repository
注解也是@Component
注解的延伸,与@Component
注解一样,被此注解标注的类会被Spring自动管理起来,@Repository
用于标注DAO层的数据持久化类。
@Repository
public interface SysDocumentCatalogueDao extends BaseMapper<SysDocumentCatalogue> {
}
三、Spring DI
@DependsOn
@DependsOn
可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中.
@DependsOn注解可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中,一般与@Component或者@Bean注解结合使用
@Component
@DependsOn("dependson02")
public class Dependson01 {
Dependson01(){
System.out.println("Dependson01 success");
}
}
@Bean
@Bean注解主要的作用是告知Spring,被此注解所标注的类将需要纳入到Bean管理工厂中。@Bean注解的用法很简单,在这里,着重介绍@Bean注解中initMethod
和destroyMethod
的用法。示例如下:
@Slf4j
public class CustomConfig {
public void init(){
log.info("CustomConfig ----------> init");
}
public void destroy(){
log.info("CustomConfig ----------> destroy()");
}
}
@Bean(initMethod = "init",destroyMethod = "destroy")
public CustomConfig customConfig(){
return new CustomConfig();
}
四、Scope注解
@Scope
@Scope注解是 Spring IOC 容器中的一个作用域,在 Spring IOC 容器中,他用来配置Bean实例的作用域对象。@Scope 具有以下几种作用域:
- singleton 单实例的(单例)(默认情况下,Spring IoC容器所初始化的类实例都为singleton)----全局有且仅有一个实例
- prototype 多实例的(多例)---- 每次获取Bean的时候会有一个新的实例
- reqeust 同一次请求----request:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
- session 同一个会话级别---- session:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public SecondBean secondBean(){
return new SecondBean();
}
五、容器配置注解
@Autowired
@Autowired用于标记Spring将要解析和注入的依赖项。此注解可以作用在构造函数、字段和setter方法上。
作用于构造函数
public class SecondBean {
private final FirstBean firstBean;
@Autowired
public SecondBean(FirstBean firstBean){
this.firstBean = firstBean;
}
}
作用于setter方法
public class RedisUtil {
private RedisTemplate redisTemplate;
@Autowired
@Order
public void setRedisTemplate(RedisTemplate redisTemplate) {
}
}
作用于字段
@Autowired注解标注字段是最简单的,只需要在对应的字段上加入此注解即可,示例代码如下:
@RestController
@RequestMapping("/api")
public class AuditWebController {
@Autowired
private AuditService auditService;
}
@Primary
当系统中需要配置多个具有相同类型的bean时,@Primary可以定义这些Bean的优先级。
public interface SmsService{
boolean sendMsg(String phone,String msg);
}
@Slf4j
@Service
public class AliyunSmsService implements SmsService{
public boolean sendMsg(String phone,String msg){
log.info("阿里云发送短信 手机号码:{} msg:{}",phone,msg);
}
}
@Slf4j
@Service
@Primary
public class TencentSmsService implements SmsService{
public boolean sendMsg(String phone,String msg){
log.info("腾讯云发送短信 手机号码:{} msg:{}",phone,msg);
}
}
当我们直接注入SmsService时,一定时注入的TencentSmsService
@PostConstruct与@PreDestroy
值得注意的是,这两个注解不属于Spring,它们是源于JSR-250中的两个注解,位于common-annotations.jar
中。@PostConstruct用于标注在Bean被Spring初始化之前需要执行的方法。@PreDestroy用于标注Bean被销毁前需要执行的方法。
@PostConstruct
public void init(){
}
@PreDestroy
public void destroy(){
}
@Qualifier
当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者
public interface SmsService{
boolean sendMsg(String phone,String msg);
}
@Slf4j
@Service("aliyunSmsService")
public class AliyunSmsService implements SmsService{
public boolean sendMsg(String phone,String msg){
log.info("阿里云发送短信 手机号码:{} msg:{}",phone,msg);
}
}
@Slf4j
@Service("tencentSmsService")
public class TencentSmsService implements SmsService{
public boolean sendMsg(String phone,String msg){
log.info("腾讯云发送短信 手机号码:{} msg:{}",phone,msg);
}
}
使用以下的方法注入指定的实现类:
@Autowired
@Qualifier("tencentSmsService")
private SmsService smsService;
六、Spring Boot注解
@SpringBootApplication
@SpringBootApplication
注解是一个快捷的配置注解,在被它标注的类中,可以定义一个或多个Bean,并自动触发自动配置Bean和自动扫描组件。这个配置等同于:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。
在Spring Boot应用程序的主类中,就使用了此注解。
@SpringBootApplication
public class Application{
public static void main(String [] args){
SpringApplication.run(Application.class,args);
}
}
@EnableAutoConfiguration
@EnableAutoConfiguration用于通知Spring,根据当前类路径下引入的依赖包,自动配置与这些依赖包相关的配置项。
@ConditionalOnClass与@ConditionalOnMissingClass
这两个注解属于类条件注解,它们根据是否存在某个类作为判断依据来决定是否要执行某些配置。下面是一个简单的示例代码:
@Configuration
@ConditionalOnClass(DataSource.class)
class MySQLAutoConfiguration {
//...
}
@ConditionalOnBean与@ConditionalOnMissingBean
这两个注解属于对象条件注解,根据是否存在某个对象作为依据来决定是否要执行某些配置方法。示例代码如下:
@Bean
@ConditionalOnBean(name="dataSource")
LocalContainerEntityManagerFactoryBean entityManagerFactory(){
//...
}
@Bean
@ConditionalOnMissingBean
public MyBean myBean(){
//...
}
@ConditionalOnProperty
@ConditionalOnProperty注解会根据Spring配置文件中的配置项是否满足配置要求,从而决定是否要执行被其标注的方法。示例代码如下:
@Bean
@ConditionalOnProperty(name="alipay",havingValue="on")
Alipay alipay(){
return new Alipay();
}
@ConditionalOnResource
此用于检测当某个配置文件存在使,则触发被其标注的方法,下面是使用此注解的代码示例:
@ConditionalOnResource(resources = "classpath:website.properties")
Properties addWebsiteProperties(){
//...
}
@ConditionalOnWebApplication与@ConditionalOnNotWebApplication
这两个用于判断当前的应用程序是否是Web应用程序。如果当前应用是Web应用程序,则使用Spring WebApplicationContext,并定义其会话的生命周期。下面是一个简单的示例:
@ConditionalOnWebApplication
HealthCheckController healthCheckController(){
//...
}
@ConditionalExpression
此注解可以让我们控制更细粒度的基于表达式的配置条件限制。当表达式满足某个条件或者表达式为真的时候,将会执行被此注解标注的方法。
@Bean
@ConditionalException("${localstore} && ${local == 'true'}")
LocalFileStore store(){
//...
}
@Conditional
@Conditional注解可以控制更为复杂的配置条件。在Spring内置的条件控制注解不满足应用需求的时候,可以使用此注解定义自定义的控制条件,以达到自定义的要求。下面是使用该注解的简单示例:
@Conditioanl(CustomConditioanl.class)
CustomProperties addCustomProperties(){
//...
}
七、其他注解
注解 | 注解说明 |
---|---|
@Configuration | 相当于传统的xml配置文件,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。 |
@Import | 用来导入其他配置类。 |
@ImportResource | 用来加载xml配置文件。 |
@Service | 一般用于修饰service层的组件 |
@Repository | 使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。 |
@Bean | 用@Bean标注方法等价于XML中配置的bean。 |
@Value | 注入Spring boot application.properties配置的属性的值 |
@Inject | 等价于默认的@Autowired,只是没有required属性; |
@Component | 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 |
@Resource | (name=”name”,type=”type”):没有括号内内容的话,默认byName。与@Autowired干类似的事 |
@JsonBackReference | 解决嵌套外链问题 |
@RepositoryRestResourcepublic | 配合spring-boot-starter-data-rest使用 |
注意:本文归作者所有,未经作者允许,不得转载