spring注解是如何实现的

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

用过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 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注解+反射来完成
 

转载于:https://my.oschina.net/u/3906190/blog/2479364

你可能感兴趣的:(spring注解是如何实现的)