微信公众号:用心程序员
介绍
手写spring事务注解,意思是自定义@ExtTransactional事务注解,实现类似spring自带注解@Transactional一样的功能
一、Java自定义注解
注解是Jdk1.5新增新技术。很多框架为了简化代码,都会提供一些注解。注解可以理解为插件,是代码级别的插件,不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。
Java提供了三种内建注解
@Override 当我们想要复写父类中的方法时,我们需要使用该注解去告知编译器我们想要复写这个方法。这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息。
@Deprecated 当我们希望编译器知道某一方法不建议使用时,我们应该使用这个注解。
@SuppressWarnings 这个仅仅是告诉编译器忽略特定的警告信息
Java还提供了4种元注解,专门负责新注解的创建
元注解 | 解释 |
---|---|
@Target | 表示该注解可以用于什么地方,如果Target元注解没有出现,那么定义的注解可以应用于程序的任何元素。ElementType参数有: CONSTRUCTOR:构造器的声明 FIELD:域声明(包括enum实例) LOCAL_VARIABLE:局部变量声 METHOD:方法声明 PACKAGE:包声明 PARAMETER:参数声明 TYPE:类、接口(包括注解类型)或enum声 |
@Retention | 表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括: SOURCE:注解将被编译器丢弃 CLASS:注解在class文件中可用,但会被VM丢弃 RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息 |
@Document | 将注解包含在Javadoc中 |
@Inherited | 允许子类继承父类中的注解 |
创建Java自定义注解
创建自定义注解和创建一个接口相似,但是注解的interface关键字需要以@符号开头。我们可以为注解声明方法。
@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AddAnnotation {
int userId() default 0;
String userName() default "默认名称";
String[] arrays();
}
- 注解方法不能带有参数;
- 注解方法返回值类型限定为:基本类型、String、Enums、Annotation或者是这些类型的数组;
- 注解方法可以有默认值;
- 注解本身能够包含元注解,元注解被用来注解其它注解。
二、 手写spring事务注解实现过程
思路:
- 定义事务注解
- 封装编程事务
- 扫包(用于判断方法是否有事务注解)
- 拦截方式时,使用反射技术判断方法上是否有事务注解,再决定是否开启事务
实现过程:
第一步 定义事务注解@ExtTransaction
@Target({
ElementType.METHOD }) //该注解用于方法
@Retention(RetentionPolicy.RUNTIME)