我可以不吃啊 发表于 2024-7-31 09:38:07

Java注解

概念

Java注解用于为Java代码提供元数据,作为元数据,注解不直接影响代码的执行,但也有一些类型的注解现实上可以用于这一目标。
分类

Java注解可以分为2种,第一种是元注解,第二种是自界说注解。
所谓元注解就是用来形貌注解的注解,这里的元是由Meta翻译过来的。我们可以把元注解理解为J DK为了让我们自界说注解而提供的一些注解,在Java体系中,元注解只有5个,分别为@Target、@Retention、@Documented、@Inherited以及JDK1.8中新增的@Repeatable,除此之外的全部注解都是基于这5个注解界说出来的,所以也叫自界说注解。自界说注解又可以分为JDK内置注解以及开发者自界说的注解等多种。
五个元注解

1、@Target

用来指定一个注解的使用范围,如是用在方法照旧成员变量等。参考该注解的源码可以看到,该注解有一个成员变量 ElementType[] value(); 其中的ElementType表现的是一个枚举类, 所以说该属性可以界说多个ElementType,即可以指定多个范围,如指定类型和方法两个范围,就可以写成如下格式:
https://i-blog.csdnimg.cn/direct/ee64b153efdf441390494e70ba4175ac.png
Target注解的源码如下图所示:
https://i-blog.csdnimg.cn/direct/60d5b27a0ea742b48c66d5c0fea63cb9.png
其中的ElementType如下所示:
https://i-blog.csdnimg.cn/direct/32fdcd42eba541a7ac9e2032cee9d711.png
2、@Documented

使用该注解会被JavaDoc工具类提取成文档。默认环境下JavaDoc中是不包罗注解的,如果界说注解时指定了@Documented,则表明这个注解信息必要包罗在JavaDoc中。
3、@Retention

用于形貌注解的保留策略,表如今什么级别生存该注解信息。其中有一个RetentionPolicy类型的成员变量用来指定保留策略,RetentionPolicy也是一个枚举。
https://i-blog.csdnimg.cn/direct/774909ade5a94153a85d9f0257c3dd00.png
RetentionPolicy枚举只有3个枚举项:
https://i-blog.csdnimg.cn/direct/3f1579c3204f41169eaf97cbaf71bcfc.png
我们常常看到的RetentionPolicy.RUNTIME ,很多时候是由于要在运行期通过反射读取。
https://i-blog.csdnimg.cn/direct/e10b2ed5fa014ad28cb9dd36efa48065.png
4、@Inherited

用来指定该注解可以被继承。如当我们用@Inherited注解修饰了A类,这时候A的子类B类也会主动具有该注解。
应留意的是,@Inherited只会影响类上的注解,而方法和属性上的注解的继承性是不受@Inherited影响的。而声明在方法、成员变量处的注解,即使该注解没有使用@Inherited标注,默认都是可以继承的,除非子类重写了父类的方法或者父类中的成员变量。
5、@Repeatable

Java8新增的一个元注解,使用该注解来标识允许一个注解在一个元素上使用多次。如果不使用@Repeatable注解修饰自界说注解,那么该自界说注解默认是不能在同一元素上多次使用的。
如我想界说一个NoTXSql注解,这个注解可以在一个方法上用多次,其界说如下:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
// 注意这里用的是新定义的注解NoTXSqlGroup
@Repeatable(NoTXSqlGroup.class)
public @interface NoTXSql {

    //

}



@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface NoTXSqlGroup {
    /**
   * value
   *
   * @return NoTXSql[]
   */
    // 新定义的注解NoTXSqlGroup的value 是数组NoTXSql
    NoTXSql[] value();
}

注解的继承与组合

注解类是不能继承其他类也不能实现其他接口的。但是注解与注解之间是可以建立组合关系的。
注解与反射结合

固然注解没办法直接影响代码的执行,但是注解结合反射技能,那么可以做的事变的就非常多了。
反射的发生,一定是在运行期,因此@Retention所指定的范围也一定是运行期间,RetentionPolicy一定是RUNTIME。通过反射技能在运行期获取了标注在类和方法上的注解及注解中成员变量的值。
不要过度依赖注解

事务可以分为编程式事务和声明式事务,其中声明式事务就是依赖注解实现的。
声明式事务管理方法允许开发者在配置的资助下管理事务,而不必要依赖底层API进行硬编码。开发者可以只使用注解或者基于配置的XML来管理事务。
声明式事务的优点

其管理是通过AOP实现的,本质是谁人就是在目标方法执行前后进行拦截。在目标方法执行前到场或者创建一个事务,在目标方法执行后,根据现实环境选择提交或者回滚事务。这种方式对代码无侵入性,在方法内只必要编写业务逻辑即可。
声明式事务粒度

声明式事务有一个范围,就是它的最小粒度是作用在方法上的。
如果一个开发者没有留意到一个方法是被事务嵌套的,那么就可能在方法中到场一些如RPC远程调用、消息发送、缓存更新和文件写入等操纵。这些操纵被包罗在事务中就可以有如下2个问题:
(1)、这些操纵自身没有办法回滚,就会导致数据不以同等。
(2)、事务中有远程调用就会拉长整个事务,导致本领务的数据库连接不停被占用,如果这样的操纵过多,就会导致数据连接池耗尽。
正由于有容易忽视的问题,因此不建议用声明式事务。
声明式事务用不对容易失效

以下场景可能导致事务失效
(1)、@Transactional应用在非public方法上;
(2)、@Transactional注解属性propagation设置错误;
(3)、@Transactional注解属性rollbackFor设置错误;
(4)、在同一个类中调用方法,导致@Transactional失效;
(5)、异常被catch捕获导致@Transactional失效;
(6)、数据库引擎不支持事务。














参考《深入理解Java核心技能》



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Java注解