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