JAVA框架封装(四):注解定义

前面讲到用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,一起讨论测试的那此事。

发布了47 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/kingzhsh/article/details/97612447