前面讲到用Goods类,来做为例子说明整个框架功能,类里有很多的注解。那么现在就讲讲怎么定义这些注解。首先在src/main/java上右击,New ——> Package
Name输入org.kingeasy.annotation,新建一个包,专门用来放注解,Finish。然后在包名上右击,New ——> Interface
Name输入RoadMapping,这就是第一个注解,路径映射注解了,代码:
package org.kingeasy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface RoadMapping {
String value();
}
上面有两个元注解,第一个是指定注解的生命周期的,现在的这个注解就指定注解在代码运行时有效。第二个注解是指定注解的作用范围的,也就是这个注解,可以加到什么上面。ElementType.TYPE,指定注解可以加在类上。也意味着,我们定义的RoadMapping注解,不能加到类的成员变量和成员方法上。同样的,可以再定义其它注解:
TableName注解
package org.kingeasy.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface TableName {
String value();
}
ColumnName注解
package org.kingeasy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ColumnName {
String value();
}
PrimaryKey注解
package org.kingeasy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface PrimaryKey {
String value() default "";
}
NoRepeat注解
package org.kingeasy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.FIELD})
public @interface NoRepeat {
String value();
}
Immutable注解
package org.kingeasy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Immutable {
}
NoDeletion注解
package org.kingeasy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface NoDeletion {
String value();
}
Search注解
package org.kingeasy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Repeatable(Searches.class)
public @interface Search {
String param() default "";
String exp() default "=?";
}
默认的情况下,在同一个资源上,是不能添加两个同样类型的注解的。所以,需要再添加注解,来指定这个注解是可以重复的。@Rapeatable(Searches.class),就指定这个注解是可以重复的,如果在同一个资源上添加了两个同类型的注解,那么添加的Search注解,会自动转成Searches注解,而Searches注解里放的,就是一个Search的数组。
Searches注解
package org.kingeasy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Searches {
Search[] value();
}
Mapping和Statistic注解里,都用到了枚举类,所以需要先定义枚举类,现在我的枚举类,暂时都放在org.kingeasy.base下面
枚举类TableRelation
package org.kingeasy.base;
public enum TableRelation {
ONE_TO_ONE,
ONE_TO_MANY,
MANY_TO_ONE,
MANY_TO_MANY
}
枚举类Statistics
package org.kingeasy.base;
public enum Statistics {
COUNT,
SUM,
AVG,
MAX,
MIN
}
Mapping注解
package org.kingeasy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.kingeasy.base.TableRelation;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Mapping {
TableRelation tableRelation() default TableRelation.ONE_TO_ONE;
String[] value() default {};
}
Statistic注解
package org.kingeasy.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.kingeasy.base.Statistics;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Statistic {
String key() default "total";
Statistics statistic() default Statistics.COUNT;
boolean handleNull() default false;
}
把这些注解定义好,项目结构就是这样的:
因为现在都不考虑java中类的继承,所以注解的定义,也没有考虑继承的情况,这个在后面做继承兼容的时候,再做相应的修改就可以了
欢迎加入测试群:91425817,一起讨论测试的那此事。