在以前的工作中,要好多东西虽然不明白怎么回事,但是感觉很方便,很神奇,例如,spring中的@service,@controller,@requestmapping等就特别的方便,下面我就记录一下我对注解的理解以及运用方法。
- 首先,我们怎么才能吧注解加到我们的类中呢?我们需要先创建注解的类,也就是@interface的类
@Retention(RetentionPolicy.RUNTIME) @Target(value = ElementType.FIELD) public @interface QueryField { LogicType logicType() default AND; Operator operator() default LIKE; String fieldName(); String[] paramName(); Type type() default STRING; boolean ignoreCase() default true; MatchType matchType() default ANYWHERE; public enum MatchType { ANYWHERE(MatchMode.ANYWHERE), EXACT(MatchMode.EXACT), START( MatchMode.START), END(MatchMode.END); MatchMode matchModel; /** * @param matchModel */ private MatchType(MatchMode matchModel) { this.matchModel = matchModel; } /** * @return the matchModel */ public MatchMode getMatchModel() { return matchModel; } } }
@Retention用来声明注解的保留策略,有CLASS、RUNTIME和SOURCE这三种,分别表示注解保存在类文件、JVM运行时刻和源代码中。只有当声明为RUNTIME的时候,才能够在运行时刻通过反射API来获取到注解的信息。@Target用来声明注解可以被添加在哪些类型的元素上,如类型、方法和域等。
这个类里面的属性,就是注解中锁添加的参数。
- 然后,我们就要调用这个注解了,因为这个注解的target为field,所以我们要在属性上面去加这个注解
@Scope("prototype") @QueryEntity(WsJcxxGrlxfsb.class)//基础信息-个人联系方式 public class QueryObjectDemo implements QueryObject,Serializable{ /** * */ private static final long serialVersionUID = -8361090782068743413L; @QueryField(fieldName="xnzjhm" ,paramName="xnzjhm",operator=Operator.LIKE,matchType=MatchType.ANYWHERE) private String xnzjhm;//校内证件号码 @QueryField(fieldName="sj",paramName="sj",operator=Operator.EQ ) private String sj; // 手机 @QueryField(fieldName="xgsj" ,paramName="xgsjArr",operator=Operator.BETWEEN) private Date[] xgsjArr; // 修改时间(记录记录生成或最后一次修改的时间) private Date xgsj1; private Date xgsj2; @Override public void beforeBuildCriteria() { xgsjArr = new Date[] {xgsj1,xgsj2}; } @Override public Criteria afterBuildCriteria(Criteria cr) { cr.addOrder(Order.desc("xgsj")); return cr; } /** * @return the xnzjhm */ public String getXnzjhm() { return xnzjhm; } /** * @param xnzjhm the xnzjhm to set */ public void setXnzjhm(String xnzjhm) { this.xnzjhm = xnzjhm; } /** * @return the sj */ public String getSj() { return sj; } /** * @param sj the sj to set */ public void setSj(String sj) { this.sj = sj; } /** * @return the xgsjArr */ public Date[] getXgsjArr() { return xgsjArr; } /** * @param xgsjArr the xgsjArr to set */ public void setXgsjArr(Date[] xgsjArr) { this.xgsjArr = xgsjArr; } /** * @return the xgsj1 */ public Date getXgsj1() { return xgsj1; } /** * @param xgsj1 the xgsj1 to set */ public void setXgsj1(Date xgsj1) { this.xgsj1 = xgsj1; } /** * @return the xgsj2 */ public Date getXgsj2() { return xgsj2; } /** * @param xgsj2 the xgsj2 to set */ public void setXgsj2(Date xgsj2) { this.xgsj2 = xgsj2; } }
- 好了。现在我们都已经把注解都加好了,那么我们加了这些到底有什么用呢,大家接着往下看
public class QueryObjectHelper { public static <T extends QueryObject> Criteria buildCriteria( T qo,Session session) { qo.beforeBuildCriteria(); QueryEntity annQo = qo.getClass().getAnnotation(QueryEntity.class); Criteria criteria = session.createCriteria(annQo.value()); Field[] fieldArr = qo.getClass().getDeclaredFields(); for (Field field : fieldArr) { Annotation fieldAnn = field.getAnnotation(QueryField.class); field.setAccessible(true); try { if (fieldAnn == null || fieldAnn.equals("") || field.get(qo) == null || field.get(qo).equals("")) { continue; } Criterion exp = buildExpression(field, qo); criteria.add(exp); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } field.setAccessible(false); } criteria = qo.afterBuildCriteria(criteria); return criteria; } private static <T extends QueryObject> Criterion buildExpression( Field field, T qo) throws IllegalArgumentException, IllegalAccessException { Param firstParam = null; Param secondParam = null; Param likeParam = null; QueryField ann = field.getAnnotation(QueryField.class); switch (ann.operator()) { case BETWEEN: firstParam = Param.getCommonParam(ann.paramName()[0], ((Object[]) field.get(qo))[0], ann.type()); secondParam = Param.getCommonParam(ann.paramName()[1], ((Object[]) field.get(qo))[1], ann.type()); return Between.between(ann.logicType(), ann.fieldName(), firstParam, secondParam); case NOT_BETWEEN: firstParam = Param.getCommonParam(ann.paramName()[0], ((Object[]) field.get(qo))[0], ann.type()); secondParam = Param.getCommonParam(ann.paramName()[1], ((Object[]) field.get(qo))[1], ann.type()); return Between.notBetween(ann.logicType(), ann.fieldName(), firstParam, secondParam); case EQ: firstParam = Param.getCommonParam(ann.paramName()[0], field.get(qo), ann.type()); return Compare.eq(ann.logicType(), ann.fieldName(), firstParam); case NE: firstParam = Param.getCommonParam(ann.paramName()[0], field.get(qo), ann.type()); return Compare.ne(ann.logicType(), ann.fieldName(), firstParam); case LT: firstParam = Param.getCommonParam(ann.paramName()[0], field.get(qo), ann.type()); return Compare.lt(ann.logicType(), ann.fieldName(), firstParam); case LE: firstParam = Param.getCommonParam(ann.paramName()[0], field.get(qo), ann.type()); return Compare.le(ann.logicType(), ann.fieldName(), firstParam); case GT: firstParam = Param.getCommonParam(ann.paramName()[0], field.get(qo), ann.type()); return Compare.gt(ann.logicType(), ann.fieldName(), firstParam); case GE: firstParam = Param.getCommonParam(ann.paramName()[0], field.get(qo), ann.type()); return Compare.ge(ann.logicType(), ann.fieldName(), firstParam); case LIKE: likeParam = Param.getVarcharParam(ann.paramName()[0], field.get(qo), ann.ignoreCase(), ann.matchType() .getMatchModel()); return Like.like(ann.logicType(), ann.fieldName(), likeParam); case NOT_LIKE: likeParam = Param.getVarcharParam(ann.paramName()[0], field.get(qo), ann.ignoreCase(), ann.matchType() .getMatchModel()); return Like.notLike(ann.logicType(), ann.fieldName(), likeParam); case IN: firstParam = Param.getCommonParam(ann.paramName()[0], field.get(qo), ann.type()); return In.in(ann.logicType(), ann.fieldName(), firstParam); case NOT_IN: firstParam = Param.getCommonParam(ann.paramName()[0], field.get(qo), ann.type()); return In.notIn(ann.logicType(), ann.fieldName(), firstParam); case IS_NULL: return JudgeNull.isNull(ann.logicType(), ann.fieldName()); case IS_NOT_NULL: return JudgeNull.isNotNull(ann.logicType(), ann.fieldName()); default: break; } return null; } }
我们可以看到,我们是通过我们的注解,以及注解中的参数,把我们需要的数据拿了过来重新组装成我们需要的东西,这样看来,很多相似的东西我们就可以这样做,从实现的原理上我们参考的是封装,而从根本实现是基于java的反射机制,通过反射,以及我们对规则的掌握,我们就可以通过注解的方式去实现很多重复的方法,其中不同的东西,我们也是靠参数传到注解里面了,这样我们的代码看着就很整洁,而且会减少我们没有必要的冗余代码,从实现与框架上都是一个不错的选择,我们可以通过这个写一套自己的SPRING框架!就是这么简单!
相关推荐
在实际使用中,`annotation-file-utilities.jar`可能需要与其他构建工具(如Maven或Gradle)配合,通过指定依赖关系将其引入项目。开发者可以利用这个库提供的功能,编写更加高效和可维护的代码,同时减少手动配置和...
同时,配合提供的`annotation.txt`文件,你可能能获取到更多关于注解的实际案例和示例代码,进一步巩固理论知识。 总的来说,注解是Java编程中不可或缺的一部分,熟练掌握注解的使用不仅能提高代码的可读性和可维护...
通过这个"Android Annotation 实例"的压缩包,你可以深入学习如何在实际项目中运用这些注解,理解它们的工作原理,以及如何通过注解优化代码结构和提高开发效率。实践中,不断尝试并结合个人项目需求,你将更好地...
在Java开发中,SSH(Struts2、Spring、Hibernate)框架是常见的企业级应用开发框架,它极大地简化了Web应用程序的构建过程。...在实际项目中,熟练运用这些注解能够提升开发效率,同时保持代码的整洁和可维护性。
《深入理解Hibernate注解》 Hibernate作为Java领域中的一款强大持久化框架,极大地简化了数据库操作。而Hibernate注解则是其在ORM...通过熟练掌握并合理运用这些注解,开发者可以更好地驾驭数据库操作,提高开发效率。
《SpringMVC注解详解与应用...理解并熟练运用这些注解,能让你在SpringMVC开发中游刃有余,提高开发效率和代码质量。通过阅读"springMVC详解以及注解说明.doc",你可以获得更深入的理解和实例,进一步提升自己的技能。
在Android开发中,注解(Annotation)和反射(Reflection)是两个重要的概念,它们极大地提升了代码的可维护性、灵活性和动态性。本篇将详细阐述这两个知识点,并结合实际示例进行讲解。 **注解(Annotation)** 1...
在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器、工具或运行时系统提供额外信息的方式。自定义注解允许开发者创建自己的标记来满足特定需求,比如代码生成、验证、持久化等。本文将深入探讨...
**注解(Annotation)** 注解是一种元数据,为代码提供了一种声明式的方式来添加信息。这些信息可以在编译时或运行时被工具或JVM读取。注解不是代码的一部分,但可以影响代码的行为。 1. **定义注解**:使用`@...
Spring框架是Java开发中不可或缺的一部分,它通过提供丰富的注解简化了...理解并熟练运用这些注解是每个Spring开发者必备的技能。在实际开发中,根据项目需求选择合适的注解,可以有效地组织和管理代码,提升开发效率。
《Spring Security HelloWorld 注解详解》 在Java Web开发领域,Spring Security是一个强大的安全框架,它提供了全面的安全管理解决方案...在实际开发中,我们应根据项目需求灵活运用这些注解,以实现复杂的安全策略。
在Android开发中,注解(Annotation)是一种元数据,它提供了在代码中附加信息的方式,这些信息可以被编译器或者运行时环境用来执行特定的操作。注解在Java语言中引入,随后被广泛应用于Android系统,帮助开发者实现...
Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是关于数据的数据,可以提供额外的信息,这些...学习这些材料,将有助于你全面掌握Java注解的使用,并能够在实际项目中灵活运用。
在Java编程语言中,注解(Annotation)是一种元数据,它提供了一种安全的方法来关联信息于程序元素,如类、方法、变量等,而这些信息可以...在实际开发中,理解并熟练运用 `@Target` 是使用Java注解不可或缺的一部分。
在实际应用中,注解通常与处理器(Annotation Processor)一起使用。处理器会在编译期间读取注解并执行相应的操作,例如生成源代码、验证代码或执行配置。`javax.annotation.processing.Processor`接口是实现处理器...
在实际项目中,合理运用这些注解可以有效地降低组件间的耦合度,实现松耦合的设计。 在深入研究`@Autowired`和`@Qualifier`的同时,我们还需要关注Spring的源码,理解其内部的工作原理。通过阅读源码,我们可以了解...
在Java编程语言中,Annotation(注解)是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不必影响代码的运行时行为。...在实际开发中,合理运用注解可以极大地提高开发效率和代码质量。
Java中的注解(Annotation)是元数据的一种形式,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、构建工具或者运行时环境...在实际项目中,恰当地运用注解可以简化配置、优化代码结构,并让开发流程更加高效。
Java注解,也称为 Annotation,是Java编程语言中的一种元数据机制,用于向编译器、JVM(Java虚拟机)或工具提供有关代码的信息。...在实际开发中,理解并熟练运用注解对于提升代码质量和开发效率具有重要意义。
在Java编程语言中,反射和注解是两个非常重要的特性,它们极大地增强了代码...在实际项目中,合理运用这两个特性,可以降低代码的耦合度,提高代码的可维护性和可读性。在学习过程中,务必动手实践,通过实例加深理解。