累成一条狗

SpringBoot 常用注解

一、Spring MVC 相关注解

1、@RequestMapping

(1)功能:
  将 HTTP 请求 与 请求处理类中的方法 进行映射。
  通过 RequestMappingHandlerMapping 与 RequestMappingHandlerAdapter 两个类来支持该注解。

(2)常用参数:
  value: 用于保存请求的 URL
  method: 用于指定当前请求的方法,比如:PUT,GET,DELETE,POST 等。

(3)用法举例:
  使用之前需要 通过 @RestController 或者 @Controller 注解标记类。
如下例所示:
  @RequestMapping 可以对类、方法进行标记,使用时会自动拼接。
  并根据不同的请求方法(method),找到相对应的请求处理方法。

@RestController
@RequestMapping("/api")
public class EmpController {

    @RequestMapping(value = "/emp/{id}", method = RequestMethod.GET)
    public Result selectOne(@PathVariable(name = "id") Integer id) {
        return Result.ok();
    }
    
    @RequestMapping(value = "/emp", method = RequestMethod.POST)
    public Result createEmp(@RequestBody Emp emp) {
        return Result.ok();
    }
    
    @RequestMapping(value = "/emp{id}", method = RequestMethod.DELETE)
    public Result deleteById(@PathVariable(name = "id") Integer id) {
        return Result.ok();
    }
    
    @RequestMapping(value = "/emp{id}", method = RequestMethod.PUT)
    public Result updateEmp(@PathVariable(name = "id") Integer id, @RequestBody Emp emp) {
        return Result.ok();
    }
}

 

2、@GetMapping

(1)功能:
  用于处理 HTTP 的 GET 请求。
  本质是 @RequestMapping(method = RequestMethod.GET)。

(2)举例:
  @RequestMapping(value = "/emp/{id}", method = RequestMethod.GET)
等价于
  @GetMapping("/emp/{id}")

@RestController
@RequestMapping("/api")
public class EmpController {

    @GetMapping("/emp/{id}")
    public Result selectOne(@PathVariable(name="id") Integer id) {
        return Result.ok();
    }

}

 

3、@PostMapping

(1)功能:
  用于处理 HTTP 的 POST 请求。
  本质是 @RequestMapping(method = RequestMethod.POST)。

(2)举例:
  @RequestMapping(value = "/emp", method = RequestMethod.POST)
等价于
  @PostMapping("/emp")

@RestController
@RequestMapping("/api")
public class EmpController {

    @PostMapping("/emp")
    public Result createEmp(@RequestBody Emp emp) {
        return Result.ok();
    }

}

 

4、@PutMapping

(1)功能:
  用于处理 HTTP 的 PUT 请求。
  本质是:@RequestMapping(method = RequestMethod.PUT)。

(2)举例:
  @RequestMapping(value = "/emp{id}", method = RequestMethod.PUT)
等价于
  @PutMapping("/emp{id}")

@RestController
@RequestMapping("/api")
public class EmpController {

    @PutMapping("/emp{id}")
    public Result updateEmp(@PathVariable(name = "id") Integer id, @RequestBody Emp emp) {
        return Result.ok();
    }
}

 

5、@DeleteMapping

(1)功能:
  用于处理 HTTP 的 DELETE 请求。
  本质是:@RequestMapping(method = RequestMethod.DELETE)。

(2)举例:
  @RequestMapping(value = "/emp{id}", method = RequestMethod.DELETE)
等价于
  @DeleteMapping("/emp{id}")

@RestController
@RequestMapping("/api")
public class EmpController {

    @DeleteMapping("/emp{id}")
    public Result deleteById(@PathVariable(name = "id") Integer id) {
        return Result.ok();
    }
}

 

6、@PathVariable

(1)功能:
  用于将请求地址中的模板变量 绑定到 请求处理类的方法的 参数上。
  请求地址中 使用 {} 包裹模板变量名。
  请求处理方法中 使用 @PathVariable 来获取该模板变量名。

(2)常用参数:
  name 给参数取别名,等同于 value
  value 给参数取个别名,等同于 name
  require 如果参数是非必须项,将其设为 false,默认为 true

(3)举例:
  如下例,通过 @PathVariable 绑定模板变量。
  使用 name 属性后,变量名可以自定义,可以不同于 模板变量名。
即两种方式:
  @PathVariable(name="id") Integer id2
或者
  @PathVariable(Integer id)

@RestController
@RequestMapping("/api")
public class EmpController {

    @GetMapping("/emp/{id}")
    public Result selectOne(@PathVariable(name="id") Integer id2) {
        return Result.ok();
    }

}

 

7、@RequestBody

(1)功能:
  用于处理请求参数列表,将其映射到一个对象中。
  根据请求参数名 与 对象属性名 进行匹配并绑定值(只有匹配成功才会绑定值)。
  请求参数通过 HttpMessageConverter 进行传递。

(2)举例:
  如下例,会将请求参数列表 映射 到 emp 这个对象中。

@RestController
@RequestMapping("/api")
public class EmpController {

    @PostMapping("/emp")
    public Result createEmp(@RequestBody Emp emp) {
        return Result.ok();
    }

}

 

8、@ResponseBody

(1)功能:
  用于处理请求方法的返回值,将其写入 HTTP 的响应中。
注:
  @RestController 内部包含了 @ResponseBody 和 @Controller,所以使用 @RestController 注解时,不需要再添加 @ResponseBody 注解。

(2)举例:
  如下例,将 createEmp 返回值写入 HTTP 响应中(一般为 JSON 数据)。

@Controller
@ResponseBody 
@RequestMapping("/api")
public class EmpController {

    @PostMapping("/emp")
    public Result createEmp(@RequestBody Emp emp) {
        return Result.ok();
    }

}

 

9、@RestControllerAdvice、@ControllerAdvice

(1)功能:
  可以用来处理全局异常、数据绑定、数据预处理。
  全局异常需要与 @ExceptionHandler 注解一起使用。
  数据绑定需要与 @ModelAttribute 注解一起使用。
  数据预处理需要与 @InitBinder 注解一起使用。
注:
  @RestControllerAdvice 注解包含了 @ControllerAdvice 与 @ResponseBody 注解。

全局异常处理:
  https://www.cnblogs.com/l-y-h/p/12781586.html#_label2
数据绑定、数据预处理:
  https://www.cnblogs.com/lenve/p/10748453.html

(2)举例:
  如下例:通过 @RestControllerAdvice 注解标记一个全局异常处理类,
  当异常发生时,@ExceptionHandler 可以捕获到相应的异常信息,从而进行处理。

@RestControllerAdvice
public class GlobalExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 处理 Exception 异常
     * @param e 异常
     * @return 处理结果
     */
    @ExceptionHandler(Exception.class)
    public Result handlerException(Exception e) {
        logger.error(e.getMessage(), e);
        return Result.error().message("系统异常");
    }

    /**
     * 处理空指针异常
     * @param e 异常
     * @return 处理结果
     */
    @ExceptionHandler(NullPointerException.class)
    public Result handlerNullPointerException(NullPointerException e) {
        logger.error(e.getMessage(), e);
        return Result.error().message("空指针异常");
    }
}

 

10、@ExceptionHandler

(1)功能;
  用于标注 处理指定异常的方法,当异常发生时,Spring 捕获异常并将异常传递给 @ExceptionHandler 注解标记的方法,从而进行处理。

(2)举例:
  与上例代码相同,此处不重复粘贴。

11、@RequestParam

(1)功能:
  用于将请求体中的数据 绑定到 请求处理类的方法的 参数上。
注:
  可以通过 @PathVariable 获取请求地址上的参数。
  可用通过 @RequestParam 获取请求体中的参数。

(2)常用参数:
  defaultValue 当参数为空时,可以设置一个默认值。
  其余参数与 @PathVariable 相同。

(3)举例:
  如下例,访问地址 http://localhost:8080/emp/selectOne/3?id2=2 时,
  @PathVariable   获取到的就是 3
  @RequestParam   获取到的就是 2

@RestController
@RequestMapping("/api")
public class EmpController {

    @GetMapping("/selectOne/{id}")
    public Result selectOne(@PathVariable Integer id, @RequestParam Integer id2) {
        return Result.ok();
    }

}

 

12、@Controller、@RestController

(1)功能:
  是 @Component 注解的一个延伸。
  用于标注 Spring MVC 的控制器,Spring 自动扫描并配置该注解标注的类。
注:
  @RestController 内部包含了 @ResponseBody 和 @Controller,所以使用 @RestController 注解时,不需要再添加 @ResponseBody 注解。

(2)举例:
  上面的代码中都有体现,此处不重复粘贴。

 

二、Spring Bean 注解

Spring 注解配置 Bean 参考地址:
  https://www.cnblogs.com/l-y-h/p/11342174.html

1、@ComponentScan

(1)功能:
  此注解 用于指定需要被 Spring 扫描到的类。
  通过 basePackages 或者 value 属性指定 需要扫描的包路径。

(2)举例:
  如下例:为 SpringBoot 注解标记 @SpringBootApplication 的内容。

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
      @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}

 

2、@Component、@Repository、@Service

(1)功能:
  @Component 用于标注一个普通的组件类,没有明确业务的范围,只是表示需要被 Spring 扫描并管理。

(2)@Component 功能延伸(明确业务范围)
  @Controller 用于标注一个控制类(用于控制层组件)。
  @Service 用于标注一个业务处理类(用于业务层组件)。
  @Repository 用于标注一个数据持久类(用于数据持久层组件)。

(3)举例:
  如下例,为 @Service 注解的内容。

@Component
public @interface Service {
   @AliasFor(annotation = Component.class)
   String value() default "";
}

 

3、@Bean

(1)功能:
  将所标注的类纳入到 Spring 的 Bean 管理工厂中。

(2)常用属性:
  initMethod                     用于指定初始化方法
  destroyMethod              用于指定销毁方法

(3)举例:
  如下例,将 TestBean 纳入 Bean 管理工厂中,项目一启动,会默认加载。

@SpringBootApplication
public class TestEasycodeApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestEasycodeApplication.class, args);
    }

    @Bean(initMethod ="initBean", destroyMethod = "destoryBean")
    public TestBean testBean() {
        return new TestBean();
    }
}

class TestBean {
    public void initBean() {
        System.out.println("============ hello ==============");
    }
    public void destoryBean() {
        System.out.println("============ destory ============");
    }
}

 

 

4、@DependsOn

(1)功能:
  在 Spring IOC 初始化一个 Bean 前,先初始化其他的 Bean 对象。

(2)举例:
  如下例,如果没有 指定 @DependsOn 时,会按照顺序从上而下初始化。
  但是指定后,会先初始化指定的 Bean。

@SpringBootApplication
public class TestEasycodeApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestEasycodeApplication.class, args);
    }

    @Bean(value = {"testBean"}, initMethod ="initBean", destroyMethod = "destoryBean")
    @DependsOn(value = {"testDependsOn"})
    public TestBean testBean() {
        return new TestBean();
    }

    @Bean(value = {"testDependsOn"}, initMethod ="initBean", destroyMethod = "destoryBean")
    public TestDependsOn testDependsOn() {
        return new TestDependsOn();
    }
}

class TestBean {
    public void initBean() {
        System.out.println("============ Bean hello ==============");
    }
    public void destoryBean() {
        System.out.println("============ Bean destory ============");
    }
}

class TestDependsOn {
    public void initBean() {
        System.out.println("============ Depends On hello ==============");
    }
    public void destoryBean() {
        System.out.println("============ Depends On destory ============");
    }
}

 

 

5、@Scope

(1)功能:
  用来定义 @Component、@Bean 标记的类的作用范围。

(2)常用范围:
  singleton 单例模式,每次获取的都是同一个对象
  prototype 原型模式,每次获取的都是不同的对象

(3)举例:
  如下例,Bean 指定为 单例模式,则 IOC 容器中只存在一个该类的对象,每次调用时,都是同一个对象。

@Bean(value = {"testBean"}, initMethod ="initBean", destroyMethod = "destoryBean")
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public TestBean testBean() {
    return new TestBean();
}

 

6、@Autowired、@Qualifier

(1)功能:
  用于标记 Spring 将要解析和注入 的依赖项。
  简单地理解:将 Spring 容器的对应的内容注入到此注解标记的位置。

(2)举例:
  @Autowired 默认按照类型去匹配。
  若想按照名称去匹配,则需要通过 @Qualifier 注解一起使用(常用于同一个类型存在多个 Bean 对象的情况)。

@Autowired
@Qualifier("computer")
private Computer computer;

 

三、JSR-250 注解

1、@Resource

(1)功能:

  其功能等同于 @Autowired,用来自动注入,但是其默认按照名称去匹配。

(2)常用参数:
  name            指定 bean 名称去匹配
  type             指定 bean 类型去匹配

(3)举例:

import javax.annotation.Resource;

private Computer computer;

@Resource
private Phone phone;  //插入类型为Phone的对象

@Resource  //注入bean对象
public void setComputer(Computer computer) {
    this.computer = computer;
}

 

2、@PostConstruct、@PreDestroy

(1)功能:
  @PostConstruct 注解用来标记 Bean 的初始化方法。
  @PreDestroy 注解用来标记 Bean 的销毁方法。
  类似于 @Bean 中的 initMethod、destoryMethod 属性。

(2)举例:

package com.test;
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;

@Component
public class ExampleBean {
    public void execute() {
        System.out.println("执行execute处理方法1");
    }
 
    @PostConstruct //等价于<bean init-method="init">
    public void init() {
        System.out.println("初始化");
    }

    @PreDestroy  //等价于<bean destory-method="destory">
    public void destory() {
        System.out.println("释放资源");
    }
}    

 

四、SpringBoot 注解

1、@SpringBootApplication

(1)功能:
  是一个快捷的配置注解,被该注解标记的类中,可以定义一个或多个 Bean,并触发自动配置 Bean 和 扫描组件。
  其为 @ComponentScan、@EnableAutoConfiguration、@Configuration 的组合注解。

(2)举例:
  如下例,为 SpringBoot 启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class TestEasycodeApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestEasycodeApplication.class, args);
    }
}

 

2、@Configuration

(1)功能:
  此注解用于定义配置类,可用于替换 xml 配置文件(作用等同于 xml 配置文件),该注解标记的内部可以包含一个或多个 @Bean 声明的方法,并由 Spring 容器进行管理。

(2)举例:
  如下例,Configuration 注解内部 是一个 Component 注解。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
   @AliasFor(annotation = Component.class)
   String value() default "";
   boolean proxyBeanMethods() default true;
}

 

3、@EnableAutoConfiguration

(1)功能:
  此注解用于通知 Spring,根据当前类路径引入的 jar 依赖包,自动配置与这些依赖包相关的配置项。

(2)举例:
  如下例,为 EnableAutoConfiguration 注解的内容。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

   String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
   Class<?>[] exclude() default {};
   String[] excludeName() default {};
}

 

4、@Conditional 相关注解

(1)功能:
  @Conditional 注解可以根据一些自定义条件动态选择是否加载 某个 Bean 到 Spring IOC 容器中去。

(2)常见注解:
@ConditionalOnClass 与 @ConditionalOnMissingClass:
  根据某些类作为判断依据,从而决定是否执行某个操作。
  比如 @ConditionalOnClass, 当指定的 class 在类路径上时,才去实例化一个 Bean 到容器中。

@ConditionalOnBean 与 @ConditionalOnMissingBean:
  根据某对象作为判断依据,从而决定是否执行某个操作。
  比如 @ConditionalOnBean, 当指定的对象存在时,才去实例化一个 Bean 到容器中。

@ConditionalOnProperty:
  根据某个配置文件是否满足配置项作为判断依据,从而决定是否执行某个操作。

@ConditionalOnResource
  根据某个配置文件是否存在作为判断依据,从而决定是否执行某个操作。

@ConditionalExpression
  根据表达式作为判断依据,从而决定是否执行某个操作。
  比如:表达式为 true 时,才会实例化一个 Bean 到容器中。

(3)举例:
  如下例,为 redis 的配置(Redis backed session configuration.)。

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ RedisTemplate.class, RedisIndexedSessionRepository.class })
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@Conditional(ServletSessionCondition.class)
@EnableConfigurationProperties(RedisSessionProperties.class)
class RedisSessionConfiguration {

   @Bean
   @ConditionalOnMissingBean
   ConfigureRedisAction configureRedisAction(RedisSessionProperties redisSessionProperties) {
      switch (redisSessionProperties.getConfigureAction()) {
      case NOTIFY_KEYSPACE_EVENTS:
         return new ConfigureNotifyKeyspaceEventsAction();
      case NONE:
         return ConfigureRedisAction.NO_OP;
      }
      throw new IllegalStateException(
            "Unsupported redis configure action '" + redisSessionProperties.getConfigureAction() + "'.");
   }

   @Configuration
   public static class SpringBootRedisHttpSessionConfiguration extends RedisHttpSessionConfiguration {

      @Autowired
      public void customize(SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties) {
         Duration timeout = sessionProperties.getTimeout();
         if (timeout != null) {
            setMaxInactiveIntervalInSeconds((int) timeout.getSeconds());
         }
         setRedisNamespace(redisSessionProperties.getNamespace());
         setFlushMode(redisSessionProperties.getFlushMode());
         setSaveMode(redisSessionProperties.getSaveMode());
         setCleanupCron(redisSessionProperties.getCleanupCron());
      }

   }

}

 

posted on 2020-04-27 18:38  累成一条狗  阅读(1849)  评论(0编辑  收藏  举报

导航