zoukankan      html  css  js  c++  java
  • 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());
          }
    
       }
    
    }
  • 相关阅读:
    jsp页面数据分页模仿百度分页效果
    java EL表达式
    服务器端javascript——Rhino和Node
    HBase协处理器
    Hbase 计数器
    javascript正则表达式(二)——方法
    javascript正则表达式(一)——语法
    javascript模块化
    使用sqoop工具从oracle导入数据
    HBASE API操作问题总结
  • 原文地址:https://www.cnblogs.com/l-y-h/p/12788794.html
Copyright © 2011-2022 走看看