SpringBoot--注解

  1. @Configuration :用于定义配置类,可替换XML配置文件,被注解的类内部包含一个或多个@Bean注解方法。
    1. @Configuation等价于<Beans></Beans>
      @Bean 等价于<Bean></Bean>
      @ComponentScan等价于<context:component-scan base-package="com.dxz.demo"/>
      @Component 等价于<Bean></Bean>
  2. @Service

  3. @Controller
  4. @Respority
  5. @Component
  6. @ResponseBody
  7. 接受参数的常用注解:
    1. 普通的参数:@RequestParam
    2. 路径参数:@PathVariable

    3. 接受json格式的参数:@RequestBody

    4. * @PathVariable(路径变量)
      * @RequestHeader(获取请求头)
      * @RequestParam(获取请求参数)
      * @CookieValue(获取Cookie值)
      * @RequestAttribute(获取request域的属性)
      * @RequestBody(获取请求体[POST])
      * @MatrixVariable(矩阵变量)
  8. @EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的类生效。

    说明:

    如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。
    测试发现 @ConfigurationProperties 与 @EnableConfigurationProperties 关系特别大。

  9. @ConfigurationProperties 和 @value 有着相同的功能,但是 @ConfigurationProperties的写法更为方便

    @ConfigurationProperties 的 POJO类的命名比较严格,因为它必须和prefix的后缀名要一致, 不然值会绑定不上, 特殊的后缀名是“driver-class-name”这种带横杠的情况,在POJO里面的命名规则是 下划线转驼峰 就可以绑定成功,所以就是 “driverClassName”

    @importResource(value="xxx.xml") :引入xml的配置文件

     

    1.全局异常处理的注解:@controllerAdive
    @ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:
    1. 全局异常处理
    2. 全局数据绑定
    3. 全局数据预处理
    2.Spring注解之@validated的使用
     spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
     比如,我们判断一个输入参数是否合法,可以用如下方式

    1 首先在controller上声明需要对数据进行校验

    
    
    @RequestMapping(value="/url.json",method= {RequestMethod.POST})
    @ResponseBody
    @Transactional
    public Result<?> xxmethod( @RequestBody @Validated  XoPO xoPo)     
        throws ParseException, UnsupportedEncodingException {}
    
    

    2 然后在bean上声明需要被校验的字段

    
    
    复制代码
    @data
    public class XoPO{
        
        @validated
        private List<OrderPerson> personList;
        
        @NotNull
        @Size(max=32,message="code is null")
        private String code;
    
        @NotBlank
        @Size(max=32,message="product is null")
        private String product;
    }
    复制代码
     

     

    3.@Accessors(chain = true)
    
    这个注解是来至于lombok里面的 只需要在实体类加上就可以开启链式编程了
    链式访问,该注解设置chain=true,生成setter方法返回this(也就是返回的是对象),代替了默认的返回void。

     

    4.下面重点介绍@ApiModel 
    
    @ApiModel这个注解是比较重要的一个注解。因为在实际的开发过程中,我们知道了请求的地址后,我们更加重要的是关心这个接口的请求入参和返回值。
    
    而对于@ApiModel这个注解,可以良好的展示出请求参数的含义和返回参数的含义。

     

     

    自定义注解:

    应用场景二:自定义注解+AOP 实现日志打印

    先导入切面需要的依赖包

    <dependency>
          <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    

    定义一个注解@MyLog

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyLog {
        
    }
    

    定义一个切面类,见如下代码注释理解:

    @Aspect // 1.表明这是一个切面类
    @Component
    public class MyLogAspect {
    
        // 2. PointCut表示这是一个切点,@annotation表示这个切点切到一个注解上,后面带该注解的全类名
        // 切面最主要的就是切点,所有的故事都围绕切点发生
        // logPointCut()代表切点名称
        @Pointcut("@annotation(me.zebin.demo.annotationdemo.aoplog.MyLog)")
        public void logPointCut(){};
    
        // 3. 环绕通知
        @Around("logPointCut()")
        public void logAround(ProceedingJoinPoint joinPoint){
            // 获取方法名称
            String methodName = joinPoint.getSignature().getName();
            // 获取入参
            Object[] param = joinPoint.getArgs();
    
            StringBuilder sb = new StringBuilder();
            for(Object o : param){
                sb.append(o + "; ");
            }
            System.out.println("进入[" + methodName + "]方法,参数为:" + sb.toString());
    
            // 继续执行方法
            try {
                joinPoint.proceed();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
            System.out.println(methodName + "方法执行结束");
    
        }
    }
    

    在步骤二中的IndexController写一个sourceC进行测试,加上我们的自定义注解:

        @MyLog
        @GetMapping("/sourceC/{source_name}")
        public String sourceC(@PathVariable("source_name") String sourceName){
            return "你正在访问sourceC资源";
        }

     

     

     

     

     

     

     

      
posted @ 2021-07-30 09:30  张紫韩  阅读(53)  评论(0编辑  收藏  举报