Spring--常用注解

傻男人 1年前 ⋅ 644 阅读

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都通过RquestMappingHandlerMappingRequestMappingHndlerAdapter两个类来提供对@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注解中initMethoddestroyMethod的用法。示例如下:

@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使用

全部评论: 0

    我有话说: