spring注解是如何实现的

版权声明:本文为博主原创,欢迎转载,转载请标明出处 Blog Address:http://blog.csdn.net/jsjsjs1789 /jsjsjs1789/article/details/80037539

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

阅读更多

扫码向博主提问

shengjk1

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • 大数据
  • spark
  • 实时计算
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页

注册
友情链接:免费交友软件app排行  社区交友app开发  如何做一个新颖的交友app  聊天交友app排行  国外的交友app  免费的交友软件app  语音聊天交友app  日本人用的交友app  国内交友软件app排行  香港人用什么交友app  婚介交友app  交友app开发多少钱  日本交友app排行  澳洲同志交友app  什么app视频交友  同城婚恋交友app靠谱吗  聊天交友app花钱  外国拉拉交友软件app  中日交友app  免费的同城交友app