一 注解的原理
二 自定义注解
@EnumValid @HsFormProperty
三 常用注解
1.@ControllerAdvice
顾名思义,控制器的加强版,它注解在类上,有一种切面的功能,可以对所有的请求或者异常做相应的处理。如配合@ExeptionHandler对系统中异常按照异常类型进行处理。如对请求在执行请求方法前进行数据的@ModelAttribute处理让所有请求都拥有某个数据。如结合@InitBinder对同名属性进行形如a.nam/b.name的甄别。
@ControllerAdvice
@Order(-2147483648) --声明bean的使用顺序,而不是加载顺序;值越小优先级越高
public class HsGlobalExceptionHandler {
@ExceptionHandler({IllegalArgumentException.class})
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public HsErrorRsp handle(IllegalArgumentException exception) {
LOGGER.error("Illegal argument exception.", exception);
String errorMsg = this.messageSourceUtil.getMessage("rtd.00101102");
return HsErrorRsp.builder().errorCode("rtd.00101102").errorMsg(errorMsg).build();
}
}
2.@PostConstruct
在启动容器加载servlet的时候调用,具体时间是在调用主servlet的构造方法后,init方法前;此外当此注解修饰一个方法时,调用时间在当前类的构造方法后,@Autowired注入后;由之前可知sevlet的构造方法中进行了项目中bean的创建。
此注解修饰的方法只能加载一次,且返回值必须时void且必须为非静态
使用场景:由之前可知,此注解常用于处理类中注入实例后的处理。
@Autowired
private RequestMappingHandlerAdapter adapter;
public HsOroasBeanConfig() {
}
①@PostConstruct
public void injectSelfMethodArgumentResolver() {
List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList();
argumentResolvers.add(this.hsFormPropertyAnnotationResolver());
argumentResolvers.addAll(this.adapter.getArgumentResolvers());
this.adapter.setArgumentResolvers(argumentResolvers);
}
@Primary
@Bean
public HsFormPropertyAnnotationProcessor hsFormPropertyAnnotationResolver() {
return new HsFormPropertyAnnotationProcessor(false);
}
②@PostConstruct亦可写在主启动类中用于设定时区
@PostConstruct
void started() {
// 设置默认Spring时区为UTC时区
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
3.@SpringBootApplication
设定在主启动类似上,需要注意的是,scanBasePackage属性会根据其值的写入顺序进行bean的加载,那么在遇到一些公用的处理器的时候,会先匹配后加载的bean,一旦匹配到,前边的bean处理器就不会执行。
且当引入其他jar包的时候,指定扫描其他包里边的类
@SpringBootApplication(scanBasePackages = {"com.huawei.workflowmgnt.*", "com.huawei.ei.oroas.common.*"})
4.@ModelAttribute
作用于方法上,在到达控制器前进行参数的处理。
作用于get请求上,代表此参数将可能从三个地方获取值:
- 同名请求参数
- 同名的路径变量名
- 同名的model属性
public ResponseEntity<List<AreaInfo>> searchAreas(@ModelAttribute @Validated ListAreasOption option) {
}
@HsFormProperty("sort_by") --------将参数放进入了map中,从而放进了model中
@Pattern(regexp = "name|create_time", message = ErrorCode.DATASOURCE_SORT_BY_ERROR)
private String sortBy = "name";
5.@Valid与@Valited
注解在控制方法参数上和控制方法参数上的实体类上的参数上
使得实体类内的其他注解校验起作用,注意级联性
@Valid校验实体类整体,@Validated可分组校验
@NotNull(groups = BasicInfo.class) @Size(min = 4, max = 15, groups = BasicInfo.class)
private String password;
@NotBlank(groups = BasicInfo.class)
private String name;
@Min(value = 18, message = "Age should not be less than 18", groups = AdvanceInfo.class) private int age;
@NotBlank(groups = AdvanceInfo.class)
private String phone;
6.@Configuration -- --@Bean --@Primary
@Configuration即原来的ApplicaitonContext.xml配置文件,可以配置bean,引入资源文件等待
@Configuration
public class DatasourceConfig {
private static final String PRIMARY_DATASORUCE_PREFIX = "spring.datasource.primary";
private static final String PRIMARY_DATASORUCE_CONFIG_PREFIX = "spring.datasource.primary.configuration";
private static final String QUARTZ_DATASOURCE_PREFIX = "spring.datasource.quartz";
private static final String QUARTZ_DATASOURCE_CONFIG_PREFIX = "spring.datasource.quartz.configuration";
@Bean
@Primary
@ConfigurationProperties(prefix = PRIMARY_DATASORUCE_PREFIX)
public DataSourceProperties primaryDataSourceProperties() {
return new DataSourceProperties();
}
}
@Configuration
public class HsOroasBeanConfig {
@Autowired
private RequestMappingHandlerAdapter adapter;
public HsOroasBeanConfig() {
}
@PostConstruct
public void injectSelfMethodArgumentResolver() {
List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList();
argumentResolvers.add(this.hsFormPropertyAnnotationResolver());
argumentResolvers.addAll(this.adapter.getArgumentResolvers());
this.adapter.setArgumentResolvers(argumentResolvers);
}
@Primary
@Bean
public HsFormPropertyAnnotationProcessor hsFormPropertyAnnotationResolver() {
return new HsFormPropertyAnnotationProcessor(false);
}
@Primary
@Bean
public Validator hsBuildValidator() {
return Validation.byDefaultProvider().configure().messageInterpolator(new ResourceBundleMessageInterpolator(new AggregateResourceBundleLocator(Arrays.asList("i18n/messages")))).buildValidatorFactory().getValidator();
}
}
7.@ConfigurationProperties --@Value
@ConfigurationProperties读取yaml配置文件的内容,作用于方法和类上,作用方法/类上,参数和配置自动映射,name_class=nameClass
@Value
只能单个映射配置文件内容,且不支持复杂类型的映射,如map和实体类
8.@Bean @Primary
@Primary当一个接口有多种实现时,此注解可以使其优先加载
@Qualifier明确指定用哪个bean,当和@Primary同时存在时,它优先级高
9.@JsonProperty --@JsonIgnore --@JsonIgnoreProperties --@JsonInclude
@JsonProperty
反序列化时使用,将json数据映射到类的属性上
@JsonComponent
序列化时使用,标注在返回java类上
@JsonInclude
@JsonInclude(JsonInclude.Include.NON_NULL)
当其修饰某个类或者某个属性,则当其属性为null时,则返回时不做序列化,即无此属性
@JsonIgnore
修饰属性,json转化时此属性不转化
@JsonIgnoreProperties
修饰类,当json属性多余类中的属性时,使其不报错;当json属性少时可自然正常工作
@JsonFormat
修饰属性,帮助转化时间和日期格式
@JsonFormat(timezone="GTM+8",pattern="yyyy-MM-dd HH:mm:ss")
private Date createDate;
@JsonValue
?????????????????????
@JsonCreatror
????????????????
10.@Data --@Builder --@AllArgsConstructor --@NoArgsConstructor --@Log4j/@Slf4j
@Data提供get/set/hashcode/equal/toString
@AllArgsConstructor提供全参构造器
@NoArgsConstructor提供无参构造器
@EqualsAndHashCode注在类上,提供对应的 equals 和 hashCode 方法
@Log4j/@Slf4j : 注在类上,提供对应的 Logger 对象,变量名为 log
@Builder修饰类,相当于内部生成了一个静态内部类;可以Class.builder.name().id()这样级联操作
@Singular修饰属性,和@Builder结合使用,可以为集合类属性级联赋值,Class.builder.name(1).name(2)
11.@RequestBody --@ResponseBody
@RequestBody注解的方法返回值会被View解析,单加注@ResponseBody的方法不会被View,而是直接将java对象转化为json放入到返回体body内
12.@Param
是mybatis提供的,用来在mapper类和mapper.xml中间传递参数的注解,一个方法中可以使用多个@Param参数
13.@RestController = @Controller+@ResponseBody