【spring】注解
注解
元注解
* @Target 可以定义的位置
* @Retention 注解的生命周期
* @Documented jdk文档中可现实
* @Inherited 子类可继承
自定义注解
注解的参数放在大括号内,格式为 参数类型 参数名() default 默认值
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation2{
//myAnnotation2 有4个参数,分别为name,age,id 和schools
String name() default "";
int age() default 0;
int id();
String[] schools() default {"beijing","qinghua"};
}
如果只有一个参数,可以使用value,此时在使用注解时 value=“”前的value= 可以省略
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation3{
String value();
}
测试
@myAnnotation2(id = 1)
@myAnnotation3("hi") //value= 可以省略
public void tes(){
System.out.println();
}
注解和反射的结合运用:通过反射获取注解的值实现程序的注入
/**
* 类名的注解
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Table{
String value();
}
/**
* 字段的注解
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Filed{
String columnName();
String type();
int length();
}
@Table("db_user")
@Data
class User{
@Filed(columnName = "name",type = "varchar",length = 256)
private String name;
@Filed(columnName = "age",type = "int",length = 10)
private int age;
}
**
* 通过反射获取注解的值
*/
public class demo03 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class user = Class.forName("basic.annotation.User");
//通过反射获得注解
Annotation[] annotations = user.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation); //@basic.annotation.Table(value="db_user")
}
//通过反射获得类注解的value,然后作为数据库的值插入
Table table = (Table)user.getAnnotation(Table.class);
String value = table.value();
System.out.println(value); //db_user
//通过反射获得字段注解的value,然后作为数据库的值插入
Field f = user.getDeclaredField("name");
Filed field = f.getAnnotation(Filed.class);
String col = field.columnName(); //name
int length = field.length(); //256
String type = field.type(); //varchar
System.out.println(col);
System.out.println(length);
System.out.println(type);
}
}