java中自定义注解和常用注解

一 注解的原理

二 自定义注解

@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请求上,代表此参数将可能从三个地方获取值:

  1. 同名请求参数
  2. 同名的路径变量名
  3. 同名的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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值