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注解,元注解,常规操作的主要内容,如果未能解决你的问题,请参考以下文章