注解在数据初始化中的应用

Feb 10 2020

Java 中的注解在进行框架设计中非常有用,比如 SpringBoot,SpringMVC 框架中,今天就针对注解在数据初始化中的场景进行演示

数据初始化

定义一个注解,用来给对象做初始化工作,同时再定义注入数据的代码,就可以重复地使用注解了

定义 Java bean 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Person{
private String name;
private int age;
private String gender;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}
}

定义注解

1
2
3
4
5
6
7
8
9
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface injectData {
String name();

int age();

String gender();
}

定义注解数据注入方法,这里放到一个父类中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Base{
protected Person person;

public Base(){
try {
injectAnno();
} catch (NoSuchFieldException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
}

protected void injectAnno() throws NoSuchFieldException, IllegalAccessException, InstantiationException {
Field field = this.getClass().getDeclaredField("person");
Person person = (Person) field.getType().newInstance();
// 判断成员变量是否包含该注解
if (field.isAnnotationPresent(InjectData.class)){
// 获得这个注解对象
InjectData injectData = field.getAnnotation(InjectData.class);
person.setAge(injectData.age());
person.setGender(injectData.gender());
person.setName(injectData.name());
setPerson(person);
}
}

public Person getPerson() {
return person;
}

public void setPerson(Person person) {
this.person = person;
}
}

使用注解

1
2
3
4
5
6
7
8
9
class A extends Base{
@InjectData(name = "idea", age = 5, gender = "male")
protected Person person;
}

class B extends Base{
@InjectData(name = "java", age = 20, gender = "female")
protected Person person;
}

执行代码

1
2
3
4
5
6
7
8
9
A a = new A();
B b = new B();
Person aa = a.getPerson();
Person bb = b.getPerson();
System.out.println(String.format("A: name:%s, age:%s, gender:%s", aa.getName(), aa.getAge(), aa.getGender()));
System.out.println(String.format("B: name:%s, age:%s, gender:%s", bb.getName(), bb.getAge(), bb.getGender()));

A: name:idea, age:5, gender:male
B: name:java, age:20, gender:female

使用注解来初始化的好处是让编写具体应用代码的过程更加简洁,更加关注于数据的注入过程,让代码可读性和可维护性更高