目录
@EnableConfigurationProperties
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) |
作用
①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) |
作用
通过属性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}) |
作用
如果@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)
被注释的元素必须符合指定的正则表达式;
被注释的元素必须是电子邮件地址;
@Length
被注释的字符串的大小必须在指定的范围内;
@Range
被注释的元素必须在合适的范围内;