Springboot注解,元注解,常规操作

Posted 宇宙磅礴而冷漠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot注解,元注解,常规操作相关的知识,希望对你有一定的参考价值。

常用注解

元注解解释

@Taget描述注解可以出现的位置

    TYPE, // 类、接口、枚举类
 
    FIELD, // 成员变量(包括:枚举常量)
 
    METHOD, // 成员方法
 
    PARAMETER, // 方法参数
 
    CONSTRUCTOR, // 构造方法
 
    LOCAL_VARIABLE, // 局部变量
 
    ANNOTATION_TYPE, // 注解类
 
    PACKAGE, // 可用于修饰:包
 
    TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
 
    TYPE_USE // 使用类型的任何地方,JDK 1.8 新增

示例:

@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})//filed表示可以出现在成员变量上,可以多个位置{}

@Retention描述生命周期

    SOURCE,    // 源文件保留,Annotation只保留在源代码中(.java文件中),编译器直接丢弃这种Annotation
    
    CLASS,       // 编译期保留,默认值,编译器将把Annotation记录在class文件中。当运行java程序时,JVM不可获取Annotation信息。(默认值)
    
    RUNTIME   // 编译器将把Annotation记录在class文件中。当运行java程序时,JVM也可获取Annotation信息,程序可以通过反射获取该Annotation信息

示例:

@Retention(RetentionPolicy.RUNTIME)

@Documented 描述是否生成API文档
示例:
先自定义一个含有@Documented的注解,再用在某个类上

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Ma{
	public String message() default "默认值";
}

cmd执行命令,会在当前目录生成html文件.
此时,类文档上会保留注解@Ma信息
如果自定义注解去掉@Documented,API文档@Ma会消失

//生成API文档
javadoc -d doc xxx.java

@Inherited 描述可以被继承
示例:
创建注解:

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Ma{
	public String message() default "默认值";
}

创建父类:

@Ma(message="我是姓x")
public class Father{}

创建子类:

public class Kid extends Father{}

测试方法:

public class Test{
  public static void main(String[] args){
  	Class<?> mc = Kid.class;
  	Ma ma = mc.getAnnotation(Ma.class);
  	System.out.println(ma.message());//输出 我是姓x
  }
}

Springboot启动注解

@SpringBootConfiguration

@SpringBootConfiguration注解的本质实际为Configuration注解,二者功能也一致。它是用JavaConfig形式的配置替代xml配置。
用@Bean注解的方法,spring会将其加载到spring容器中

@EnableAutoConfiguration

@EnableAutoConfiguration自动化的配置信息,内部注解@AutoConfigurationPackage扫码主启动类的包路径。借助内部注解@Import的帮助,将所有符合自动配置条件的bean定义加载到spring容器。

@ComponentScan

注解ComponentScan的功能是自动扫描并加载符合条件的组件,然后将其加载到Bean容器中。
可以通过basePackages属性指定扫描范围。默认全部扫描,所以要将Springboot的启动类放到根代码包下。

不太常用的注解&细节

//默认true,表示延迟对象的创建,何时需要何时创建,尤其是大对象,短时间不会用到,@PreDestroy注解的方法销毁不会执行
@Lazy(true)

//初始化,描述的方法为对象生命周期初始化方法,此方法会在构造方法后执行
@PostConstruct

//生命周期销毁方法,在对象销毁之前执行
@PreDestroy

//获取参数,适用restFul风格参数,如果是map接收参数则必须写
@PathVariable

//接收参数,参数@RequestParam(required = true) 描述的必须为非空,不然就是400参数异常,如果是map接收参数则必须写
@RequestParam

//接收日期类型参数制定格式
@DateTimeFormat(pattern = "yyyy-MM-dd")

//描述controller,跨域请求
@CrossOrigin

常用操作

健康监控

简述:
Spring Boot 中actuator模块提供了健康检查,审计、指标收集,HTTP跟踪等功能,可以帮助我们更好的管理和跟踪springboot项目。

依赖配置:

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

入口访问路径:

http://localhost/actuator

application.properties配置文件配置:

management.endpoints.web.exposure.include=*

连接池(HikariCP)

添加JDBC依赖默认使用HikariCP

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

application.properties配置

spring.datasource.url=jdbc:mysql:///dbname?characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=xxx
spring.datasource.password=xxx

如果直接不使用mybatis直接操作JDBC可直接注入DataSource

全局异常处理

在项目的开发中,不管是对底层的数据逻辑操作过程,还是业务逻辑的处理过程,还是控制逻辑的处理过程,都不可避免会遇到各种可预知的、不可预知的异常。处理好异常对系统有很好的保护作用,同时会大大提高用户的体验。
处理规范:
捕获异常时与抛出的异常必须完全匹配,或者捕获异常是抛出异常的父类类型。
避免直接抛出RuntimeException,更不允许抛出Exception或者Throwable,应使用有业务含义的自定义异常(例如ServiceException)。
捕获异常后必须进行处理(例如记录日志)。如果不想处理它,需要将异常抛给它的调用者。
最外层的逻辑必须处理异常,将其转化成用户可以理解的内容。
避免出现重复的代码(Don’t Repeat Yourself),即DAY原则。
全局异常处理:

//@ControllerAdvice
//@ResponseBody
//==
@RestControllerAdvice
//@RestControllerAdvice处理全局异常处理类,当某个控制层对象方法出现异常,
//方法内部没有处理异常,方法所在的类也没有定义此异常的方法,此时系统会查找全局
//异常处理类,并检测这个全局处理类
public class GlobalExceptionHandler {
    @ExceptionHandler(ArithmeticException.class)
    public String soHandlerArithmeticException(ArithmeticException ae){
        return "global is "+ae.getMessage();
    }//此异常方法可处理这个方法所在类的所有算数异常
    //没有此类异常的话就找父类异常处理方法
    @ExceptionHandler(MyException.class)
    //方法参数异常类型是注解里的父类或同类型
    public String soHandlerArithmeticException(Exception ae){
        return "myexce is "+ae.getMessage();
    }
}
//重点:建议定义全局异常处理类

参数规则效验Validated

对于controller传过来的参数进行效验,效验失败就会抛出相应的异常
1.添加依赖

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

2.controller添加注解@Validated
3.实例(message为抛出的异常信息)

    @RequestMapping("/a3/{n1}/{n2}")
    public ResponseResult wozhidaole(@Min(value = 1,message = "最小为1") @PathVariable Integer n1, @PathVariable Integer n2){
        Integer n=n1/n2;
        return new ResponseResult("result is "+n);
    }
    @RequestMapping("/a4")
    public ResponseResult a4( Integer n1,@NotNull(message = "不能为空") Integer n2){
        Integer n=n1/n2;
        return new ResponseResult("result is "+n);
    }
    @RequestMapping("/a5")
    //实体类校验可在实体类里面的属性上使用注解
    public ResponseResult a5(@Valid User user){
        return new ResponseResult("result is "+user);
    }
    @RequestMapping("/a6/{s}")
    public ResponseResult a6(@Pattern(regexp = "a{1,3}",message = "不符合正则样式") @PathVariable String s){
        return new ResponseResult("result is "+s);
    }

以上是关于Springboot注解,元注解,常规操作的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot❤SpringClould常用注解史诗级汇总

Spring组合注解与元注解

springBoot自定义注解

springBoot自定义注解

Spring注解与Java元注解小结

SSM/springboot注解总结