`
lp895876294
  • 浏览: 285366 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

由spring的@Transactional继承机制探索@Inherited作用域

    博客分类:
  • JAVA
 
阅读更多

原文->http://elf8848.iteye.com/blog/1621392

 

子类可以继承到父类上的注解吗?

-----------------------------------------------------------------

我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。但实现情况又可细分为多种。

  

测试环境如下:

-----------------------------------------------------------------

父类的类上和方法上有自定义的注解--MyAnnotation

子类继承了这个父类,分别:

子类方法,实现了父类上的抽象方法

子类方法,继承了父类上的方法

子类方法,覆盖了父类上的方法

 

 

MyAnnotation自定义注解

-----------------------------------------------------------------

Java代码  收藏代码
  1. package test.annotation;  
  2. import java.lang.annotation.Inherited;  
  3. import java.lang.annotation.Retention;  
  4. /** 
  5.  * 自定义注解 
  6.  */  
  7. //@Inherited  //可以被继承  
  8. @Retention(java.lang.annotation.RetentionPolicy.RUNTIME)  //可以通过反射读取注解  
  9. public @interface MyAnnotation {    
  10.     String value();    
  11. }   

 

 

父类

-----------------------------------------------------------------

Java代码  收藏代码
  1. package test.annotation;  
  2. @MyAnnotation(value = "类名上的注解")  
  3. public abstract class ParentClass {  
  4.   
  5.     @MyAnnotation(value = "父类的abstractMethod方法")  
  6.     public abstract void abstractMethod();  
  7.   
  8.     @MyAnnotation(value = "父类的doExtends方法")  
  9.     public void doExtends() {  
  10.         System.out.println(" ParentClass doExtends ...");  
  11.     }  
  12.       
  13.     @MyAnnotation(value = "父类的doHandle方法")  
  14.     public void doHandle(){  
  15.         System.out.println(" ParentClass doHandle ...");  
  16.     }  
  17. }  

 

 

子类

-----------------------------------------------------------------

Java代码  收藏代码
  1. package test.annotation;  
  2. public class SubClass extends ParentClass{    
  3.     
  4.     //子类实现父类的抽象方法  
  5.     @Override    
  6.     public void abstractMethod() {    
  7.         System.out.println("子类实现父类的abstractMethod抽象方法");    
  8.     }    
  9.       
  10.     //子类继承父类的doExtends方法  
  11.       
  12.     //子类覆盖父类的doHandle方法  
  13.     @Override    
  14.     public void doHandle(){  
  15.         System.out.println("子类覆盖父类的doHandle方法");   
  16.     }  
  17. }   

 

 

测试类

-----------------------------------------------------------------

Java代码  收藏代码
  1. package test.annotation;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. public class MainTest {  
  6.     public static void main(String[] args) throws SecurityException,  
  7.             NoSuchMethodException {  
  8.   
  9.         Class<SubClass> clazz = SubClass.class;  
  10.   
  11.         if (clazz.isAnnotationPresent(MyAnnotation.class)) {  
  12.             MyAnnotation cla = clazz  
  13.                     .getAnnotation(MyAnnotation.class);  
  14.             System.out.println("子类继承到父类类上Annotation,其信息如下:"+cla.value());  
  15.         } else {  
  16.             System.out.println("子类没有继承到父类类上Annotation");  
  17.         }  
  18.   
  19.         // 实现抽象方法测试  
  20.         Method method = clazz.getMethod("abstractMethod"new Class[] {});  
  21.         if (method.isAnnotationPresent(MyAnnotation.class)) {  
  22.             MyAnnotation ma = method  
  23.                     .getAnnotation(MyAnnotation.class);  
  24.             System.out.println("子类实现父类的abstractMethod抽象方法,继承到父类抽象方法中的Annotation,其信息如下:"+ma.value());  
  25.         } else {  
  26.             System.out.println("子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation");  
  27.         }  
  28.   
  29.         //覆盖测试  
  30.         Method methodOverride = clazz.getMethod("doExtends"new Class[] {});  
  31.         if (methodOverride.isAnnotationPresent(MyAnnotation.class)) {  
  32.             MyAnnotation ma = methodOverride  
  33.                     .getAnnotation(MyAnnotation.class);  
  34.             System.out  
  35.                     .println("子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:"+ma.value());  
  36.         } else {  
  37.             System.out.println("子类继承父类的doExtends方法,没有继承到父类doExtends方法中的Annotation");  
  38.         }  
  39.   
  40.         //继承测试  
  41.         Method method3 = clazz.getMethod("doHandle"new Class[] {});  
  42.         if (method3.isAnnotationPresent(MyAnnotation.class)) {  
  43.             MyAnnotation ma = method3  
  44.                     .getAnnotation(MyAnnotation.class);  
  45.             System.out  
  46.                     .println("子类覆盖父类的doHandle方法,继承到父类doHandle方法中的Annotation,其信息如下:"+ma.value());  
  47.         } else {  
  48.             System.out.println("子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation");  
  49.         }  
  50.     }  
  51. }  

  

 

编写自定义注解时未写@Inherited的运行结果

-----------------------------------------------------------------

子类没有继承到父类类上Annotation

子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation

子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:父类的doExtends方法

子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation

 

 

编写自定义注解时写了@Inherited的运行结果

-----------------------------------------------------------------

子类继承到父类类上Annotation,其信息如下:类名上的注解

子类实现父类的abstractMethod抽象方法,没有继承到父类抽象方法中的Annotation

子类继承父类的doExtends方法,继承到父类doExtends方法中的Annotation,其信息如下:父类的doExtends方法

子类覆盖父类的doHandle方法,没有继承到父类doHandle方法中的Annotation

 

 

结论

-----------------------------------------------------------------

 

父类的类上和方法上有自定义的注解,

子类继承了这个父类,的情况下。

 

 

  编写自定义注解时未写@Inherited的运行结果: 编写自定义注解时写了@Inherited的运行结果:
子类的类上能否继承到父类的类上的注解?
子类方法,实现了父类上的抽象方法,这个方法能否继承到注解?
子类方法,继承了父类上的方法,这个方法能否继承到注解?
子类方法,覆盖了父类上的方法,这个方法能否继承到注解?

我们知道在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。

通过测试结果来看,@Inherited 只是可控制 对类名上注解是否可以被继承。不能控制方法上的注解是否可以被继承。

附注

-----------------------------------------------------------------

Spring 实现事务的注解@Transactional 是可以被继承的,

通过查看它的源码可以看到@Inherited。

分享到:
评论

相关推荐

    后端 Java Spring Data Jpa @Transactional 介绍

    在Java后端开发中,Spring框架提供了强大的事务管理能力,特别是在使用Spring Data JPA时,`@Transactional`注解使得事务处理变得简单易用。这个注解是Spring框架中的核心部分,它允许开发者声明性地控制事务边界,...

    Spring @Transactional工作原理详解

    理解`@Transactional`的工作原理和Spring AOP代理机制,以及与EntityManager的关系,可以帮助我们更好地诊断和解决问题。 总的来说,`@Transactional`提供了声明式的事务管理,极大地简化了事务相关的代码,同时...

    spring @Transactional 无效的解决方案

    在探索这个问题的来源时,我们发现了 Spring 的 AOP 实现机制的问题。Spring 的 AOP 实现方式有两种:Java 代理方式和 Cglib 动态增强方式。这两种方式在 Spring 中是可以无缝自由切换的。 Java 代理方式的优点是不...

    Spring中@Transactional事务回滚(含实例

    需要注意的是,`@Transactional`注解只能对Spring管理的bean起作用,对于非Spring管理的对象(如静态方法或第三方库的代码),`@Transactional`将无法控制事务。 六、异常处理与事务回滚 理解异常处理与事务回滚的...

    Spring声明式事务@Transactional知识点分享

    "Spring声明式事务@Transactional知识点分享" 在 Spring 框架中,@Transactional 注解是实现声明式事务的关键。通过 @Transactional 注解,可以指定事务的传播行为、隔离级别、读写控制等属性。 首先,@...

    Spring3事务管理——使用@Transactional 注解.rar

    - `@Transactional`注解仅在Spring AOP代理能够拦截到的方法上生效,因此,如果在非Spring管理的类或静态方法中使用,事务管理将不起作用。 - 如果事务属性设置不当,可能会导致数据不一致或并发问题,应谨慎调整...

    Spring @Transactional注解失效解决方案

    Spring @Transactional 注解失效解决方案 在 Spring 框架中,@Transactional 注解是用于管理事务的关键工具之一。但是,在实际开发中,我们经常会遇到 @Transactional 注解失效的问题。本篇文章将详细介绍 @...

    spring-@Transactional-jar

    spring事务管理注解jar,spring-tx-3.2.4.RELEASE.jar,导入项目即可

    springboot中事务管理@Transactional的注意事项与使用场景

    2. 默认回滚机制:Spring 基于注解的声明式事物 @Transactional 默认情况下只会对运行期异常(java.lang.RuntimeException 及其子类)和 Error 进行回滚。 3. 数据库引擎支持:数据库引擎要支持事务,使用 InnoDB。 ...

    深入学习Spring Boot排查 @Transactional 引起的 NullPointerException问题

    @Transactional 注解是 Spring Framework 提供的一种机制,用于管理事务。在 Spring Boot 应用程序中,我们可以使用 @Transactional 注解来声明事务。例如,在 StudentDao 类中,我们使用 @Transactional 注解来...

    @Transactional实现原理.txt

    @Transactional实现原理.txt

    浅谈Spring中@Transactional事务回滚及示例(附源码)

    @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked异常和unchecked异常的概念、@Transactional的...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务管理的基本概念。事务是一组数据库操作,这些操作要么全部执行,要么全部回滚,...

    spring的@Transactional注解详细用法1

    在Spring框架中,事务管理是实现企业级应用稳定性和数据一致性的重要组成部分。Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。本文将重点介绍基于`@Transactional`注解的声明式事务管理。 ...

    什么情况会导致@Transactional事务失效?

    在Java编程中,`@Transactional`注解是Spring框架提供的一种事务管理机制,它使得开发者能够在方法级别方便地声明事务边界。然而,在某些特定情况下,`@Transactional`可能会失效,导致事务无法正常工作。以下是一些...

    Spring中的@Transactional事物回滚实例源码

    在Spring框架中,`@Transactional`注解是事务管理的核心组件,它允许开发者在方法级别声明事务边界。本文将深入探讨这个注解的工作原理、如何配置以及如何在遇到异常时触发事务回滚。 首先,`@Transactional`是...

    带有@Transactional和@Async的循环依赖问题

    在Spring框架中,`@Transactional` 和 `@Async` 是两个非常重要的注解,它们分别用于声明事务管理和异步执行。然而,当这两个注解同时出现在一个方法上时,可能会引发一些复杂的问题,特别是在存在循环依赖的情况下...

    Spring源码学习十二:@Transactional是如何工作的1

    Spring 框架中 @Transactional 注解的工作原理分析 在 Spring 框架中,@Transactional 注解是一个非常重要的概念,经常用于数据库操作。那么,@Transactional 注解是如何工作的呢?让我们深入源码分析。 首先,从 ...

    spring的@Transactional注解用法解读

    【Spring的@Transactional注解用法解读】 事务管理是企业级应用程序中的关键部分,它确保了在发生异常时数据的一致性。Spring框架提供了一种统一的方式来处理事务管理,包括对不同事务API(如JTA、JDBC、Hibernate...

Global site tag (gtag.js) - Google Analytics