注解集合总结

25 篇文章 0 订阅
12 篇文章 0 订阅

目录

JAVA元注解

@Target

@Retention

@Documented

@Inherited

@AliasFor

源码

作用

@ConfigurationProperties

源码

作用

@EnableConfigurationProperties

源码

作用

@Primary与@Qualifier

作用

@ConditionalOnProperty

源码

作用

@Transactional

源码

作用

@EnableCaching

@Cacheable

@CachePut

@CacheEvict

@Caching

@CacheConfig

@Deprecated

@NotEmpty

@NotBlank

@NotNull

@NonNull

@Null

@AssertTrue

@AssertFalse

@Min(value)

@Max(value)

@DecimalMin(value)

@DecimalMax(value)

@Size(max,min)

@Digits(integer,fraction)

@Past

@Future

@Pattern(value)

@Email

@Length

@Range


JAVA元注解

@Target

@Target用来定义该注解将用于什么地方,是一个方法还是一个域:

ElemenetType.CONSTRUCTOR---------构造器声明 

ElemenetType.FIELD --------------域声明(包括 enum 实例) 

ElemenetType.LOCAL_VARIABLE------局部变量声明 

ElemenetType.METHOD -------------方法声明 

ElemenetType.PACKAGE ------------包声明 

ElemenetType.PARAMETER ----------参数声明 

ElemenetType.TYPE----------------类/接口(包括注解类型)或enum声明 

@Retention

用来定义该注解在哪一个级别可用,在源代码中(SOURCE)、类文件中(CLASS)、运行时(RUNTIME),可选的参数值在枚举类型 RetentionPolicy 中,包括:

 RetentionPolicy.SOURCE------注解将被编译器丢弃 

 RetentionPolicy.CLASS ------注解在class文件中可用,但会被VM丢弃 

 RetentionPolicy.RUNTIME ----VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息

@Documented

将此注解包含在javadoc中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see、@param 等;

@Inherited

允许子类继承父类中的注解;

@AliasFor

源码

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface AliasFor {
    @AliasFor("attribute")
    String value() default "";

    @AliasFor("value")
    String attribute() default "";

    Class<? extends Annotation> annotation() default Annotation.class;
}

作用

①value属性,默认值为空字符串,但这个属性有个别名叫做attribute//attribute属性,默认值为空字符串,但这个属性有个别名叫做value;

怎么理解呢,就是假如一个类A,原始属性名叫做param1,后来随着类A的扩展又新增了属性param2,因此,要想继续使用扩展后的类A,则必须初始化属性param2,但对于已经使用了类A的用户而言,又不想让他们修改代码,因此对param2起别名叫做param1,对param1起别名叫做param2,所以当用户传入param1之后,由于param1既是变量param1,又是变量param2的别名,所以,param1和param2都被初始化了;

③annotation属性,怎么说呢,举个例子:注解A用到了注解B,但注解A想把注解B的某个属性起别名,此刻就用到该属性,例如:

public @interface SpringBootApplication {

    @AliasFor(

        annotation = ComponentScan.class,

        attribute = "basePackageClasses"

    )

    Class<?>[] scanBasePackageClasses() default {};

 

    @AliasFor(

        annotation = Configuration.class

    )

    boolean proxyBeanMethods() default true;

}

如果不设置attribute属性的话就是在给元注解的同名属性设置别名,例如@AliasFor(annotation = Configuration.class)

@ConfigurationProperties

源码

@Target({ElementType.TYPE, ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface ConfigurationProperties {

    @AliasFor("prefix")

    String value() default "";

    @AliasFor("value")

    String prefix() default "";

    boolean ignoreInvalidFields() default false;

    boolean ignoreUnknownFields() default true;

}

作用

解析配置文件,把属性前缀是prefix/value的属性进行解析;

@EnableConfigurationProperties

源码

public @interface EnableConfigurationProperties {

    String VALIDATOR_BEAN_NAME = "configurationPropertiesValidator";

    Class<?>[] value() default {};

}

作用

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

@Primary@Qualifier

作用

@Primary:优先考虑注入的类,比如两个类继承了同一个接口,然后注入的时候是以接口名的形式注入到另一个类中的,这个由于1个接口存在2个实现类,而目标方法是以接口名字的形式来注入,Spring不知道该把哪个实现类放到目标方法里面去,而该注解就是告诉Spring面对这种情况时,优先注入带有该注解的实现类;

而@Qualifier则是通过标识符来明确说明其想要哪个Bean来注入;

@ConditionalOnProperty

源码

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
    String[] value() default {};

    String prefix() default "";

    String[] name() default {};

    String havingValue() default "";

    boolean matchIfMissing() default false;
}

作用

通过属性name以及havingValue来实现的,例如:@ConditionalOnProperty(prefix = "ibm.mq.mq02.pool", name = "enabled", havingValue = "true"),如果ibm.mq.mq02.pool.enabled有属性且属性值为true,即与havingValue属性值一直,则被注解的类生效;

@Transactional

源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
    @AliasFor("transactionManager")
    String value() default "";
    @AliasFor("value")
    String transactionManager() default "";
    Propagation propagation() default Propagation.REQUIRED;
    Isolation isolation() default Isolation.DEFAULT;
    int timeout() default -1;
    boolean readOnly() default false;
    Class<? extends Throwable>[] rollbackFor() default {};
    String[] rollbackForClassName() default {};
    Class<? extends Throwable>[] noRollbackFor() default {};
    String[] noRollbackForClassName() default {};
}

作用

如果@Transactional(rollbackFor=Exception.class),那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚;

@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚;

Value可选的限定描述符,指定使用的事务管理器;

Propagation可选的事务传播行为设置

isolation可选的事务隔离级别设置

readOnly读写或只读事务,默认读写

timeout事务超时时间设置

rollbackFor导致事务回滚的异常类数组

rollbackForClassName导致事务回滚的异常类名字数组

noRollbackFor不会导致事务回滚的异常类数组

noRollbackForClassName不会导致事务回滚的异常类名字数组

@EnableCaching

开关性注解,在项目启动类或某个配置类上使用此注解后,则表示允许使用注解的方式进行缓存操作;

@Cacheable

可用于类或方法上;在目标方法执行前,会根据key先去缓存中查询看是否有数据,有就直接返回缓存中的key对应的value值。不再执行目标方法;无则执行目标方法,并将方法的返回值作为value,并以键值对的形式存入缓存;

@CachePut

可用于类或方法上;在执行完目标方法后,并将方法的返回值作为value,并以键值对的形式存入缓存中;

@CacheEvict

可用于类或方法上;在执行完目标方法后,清除缓存中对应key的数据(如果缓存中有对应key的数据缓存的话);

@Caching

此注解即可作为@Cacheable、@CacheEvict、@CachePut三种注解中的的任何一种或几种来使用;

@CacheConfig

@Cacheable、@CacheEvict、@CachePut这三个注解的cacheNames属性是必填项(或value属性是必填项,因为value属性是cacheNames的别名属性);如果上述三种注解都用的是同一个cacheNames的话,那么在每此都写cacheNames的话,就会显得麻烦。如将@CacheConfig注解就是来配置一些公共属性(如:cacheNames、keyGenerator等)的值;

@Deprecated

此注解可用于类上、方法上、属性上;

若某类或某方法加上该注解之后,表示此方法或类不再建议使用,调用时也会出现删除线,但并不代表不能用,只是说,不推荐使用,因为还有更好的方法可以调用;

Java9中注解增加了两个新元素:since、forRemoval;

since:指定已注解的API元素已被弃用的版本;

forRemoval:表示在将来的既定版本中会被删除,应该迁移API;

@NotEmpty

用于集合类上面,加了@NotEmpty的String类、Collection、Map、数组,是不能为null或者长度为0;

@NotBlank

用于String,不能为null且trim()之后size>0;

@NotNull

用于属性注解,不能为null,但可以为empty,没有Size的约束;

@NonNull

@NonNull 在方法或构造函数的参数上使用,生成一个空值检查语句。用于指明所修饰的参数,字段或方法的值不可以为null。它是JSR 305(缺陷检查框架)的注解,是告诉编译器这个域不可能为空,当代码检查(静态检查)有空值时会给出一个风险警告。运行时不报任何警告,根据实际值得情况运行时可能出现空指针异常;

@Null

被注释的元素必须为null;

@AssertTrue

被注释的元素必须为true;

@AssertFalse

被注释的元素必须为false;

@Min(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值;

@Max(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值;

@DecimalMin(value)

被注释的元素必须是一个数字,其值必须大于等于指定的最小值;

@DecimalMax(value)

被注释的元素必须是一个数字,其值必须小于等于指定的最大值;

@Size(max,min)

被注释的元素的大小必须在指定的范围内;

@Digits(integer,fraction)

被注释的元素必须是一个数字,其值必须在可接受的范围内;

@Past

被注释的元素必须是一个过去的日期;

@Future

被注释的元素必须是一个将来的日期;

@Pattern(value)

被注释的元素必须符合指定的正则表达式;

@Email

被注释的元素必须是电子邮件地址;

@Length

被注释的字符串的大小必须在指定的范围内;

@Range

被注释的元素必须在合适的范围内;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值