赞
踩
用过spring的人都知道,spring简单的通过注解就可以完成很多事情,但这些东西是如何实现的呢以及如何应用到我们自己的代码中?接下来,让我们一起开启注解的旅程。
首先申明本文的重点不是讲解spring的注解,也不讲解spring的源码,仅仅说明spring 注解能够起作用的原理
以建表语句为例:
定义注解类
@Target(ElementType.TYPE)//表示注解用在类、接口
@Retention(RetentionPolicy.RUNTIME)//在JVM运行期间也保留注解的内容
public @interface DbTable {
public String name() default "";
}
@Target(ElementType.FIELD)//表示注解用在类的属性
@Retention(RetentionPolicy.RUNTIME)
@interface SQLString {
int id() default 0;
int value() default 0;
String name() default "";
}
定义Member类
//@DbTable(name = "哈哈哈哈")
@DbTable
class Member {
/*
如果程序员的注解中定义了名为value的元素,并且在应用改注解的时候,如果该元素是唯一需要赋值的一个元素,那么此时唔需要使用名=值对的这种语法,而只需要
在括号内给出value元素所需的值即可
*/
@SQLString(value = 50, name = "5000")
String lasttName;
@SQLString(30)//只对value的字段进行赋值
String firstName;
}
//将上面的Member转化为建表语句 class TableCreator { public static void main(String[] args) throws ClassNotFoundException { args = new String[]{"xmht.javabase.annotation.Member"}; for (String className : args) { Class<?> cl = Class.forName(className); DbTable dbTable = cl.getAnnotation(DbTable.class); if (dbTable == null) { System.out.println("No DBTable annotations in class " + className); continue; } String tableName = dbTable.name(); if (tableName.length() < 1) { tableName = cl.getSimpleName().toUpperCase(); } ArrayList<String> columnDefs = new ArrayList<>(); for (Field field : cl.getDeclaredFields()) { String columnName = null; Annotation[] anns = field.getDeclaredAnnotations();每一个field只有一个注解,所以anns[0] if (anns.length < 1) { continue; //not a bd table column } if (anns[0] instanceof SQLString) { SQLString sString = (SQLString) anns[0]; if (sString.name().length() < 1) { columnName = field.getName().toUpperCase(); } else { columnName = sString.name(); } columnDefs.add(columnName + " VARCHAR(" + sString.value() + ")" + getConstraints(sString.constraints())); } StringBuilder createCommand = new StringBuilder( "CREATE TABLE " + tableName + "(" ); for (String columndef : columnDefs) { createCommand.append("\n " + columndef + ","); } String tableCreate = createCommand.substring(0, createCommand.length() - 1) + ");"; System.out.println("Table cteation sql for " + className + " is : \n" + tableCreate); } } private static String getConstraints(Constraints con) { String constraints = ""; if (!con.allowNull()) { constraints += " NOT NULL"; } if (con.primaryKey()) { constraints += " PRIMARY KEY"; } if (con.unique()) { constraints += " UNIQUE"; } return constraints; } }
总结一下:抛开效率、验证等,spring的注解其实可以通过java注解+反射来完成
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。