[编织消息框架][JAVA核心技术]annotation基础
应用动态代理技术要先掌握annotation技术
注解是JDK1.5之后才有的新特性,JDK1.5之后内部提供的三个注解
@Deprecated 意思是“废弃的,过时的”
@Override 意思是“重写、覆盖”
@SuppressWarnings 意思是“压缩警告”
注解可以加在类名,方法,参数,属性等,为开发者自定义编译处理,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解
所以注解是做框架必备技术
先来看看如何书写Annotation
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.FIELD)
@Retention(RetentionPolicy.CLASS)
public @interface TestAnno{
int value();
String name() default "";
}
1.书写跟interface一样,前面加了个@符号
2.属性可以加默认值
3.@Target 是使用权,作用于类名,方法,参数,属性等地方,可以有多个使用权
4.@Retention 是决定注解生命周期 ,分别为 SOURCE,CLASS,RUNTIME 第一个权限越低
SOURCE 只是在源码上保留,java文件编译成class去掉
CLASS 保留在class但在加载时忽略
RUNTIME 保留在class并加载时保留
来验证下@Retention
import java.lang.reflect.Field;
public class TestAnnotation {
@TestAnno(value = 1, name = "a")
private int a;
public static void main(String[] args) {
for (Field field : TestAnnotation.class.getDeclaredFields()) {
TestAnno anno = field.getAnnotation(TestAnno.class);
System.out.println(anno.value());
}
}
}
执行结果:
Exception in thread "main" java.lang.NullPointerException
at com.eyu.onequeue.TestAnno.main(TestAnno.java:13)
我们来修改下@Retention(RetentionPolicy.RUNTIME)
再执行就正常了
接下来看看spring是如何应用注解技术的
如spring切面拦截
@Aspect
public class TestAspect {
@Around("@annotation(annotation class)")
public Object exceptionHandler(ProceedingJoinPoint pjp) throws Throwable {
Object result = pjp.proceed(pjp.getArgs());
return result;
}
}
1.@Aspect将处理范围准确到类,一个处理对应一个注解
2.扫描每个类的属性或方法,提取@Around的信息
3.提取后应缓存起来,不用每次重新处理
我们来看下为什么要缓存起来
在main里加一行System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
运行后 用jd-gui打开 $Proxy1,只是分析value方法,可以看到用反射invoke执行结果,而invoke执行比较耗时

public final int value()
{
try
{
return ((Integer)this.h.invoke(this, m4, null)).intValue();
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
接下来看看Hibernate应用
@Entity
@NamedQueries({
@NamedQuery(name = Player.ACCOUNT2ID, query = "select account, id from Player"),
@NamedQuery(name = Player.ONLINE_IDS, query = "select id from Player WHERE logined = 1"),
})
public class Player { static final String ACCOUNT2ID = "Player_Account2Id"; public static final String ONLINE_IDS = "Player_ONLINE_IDS"; static final String IDX_ACCOUNT = "Player_Account"; @Id
private long id; @Index(name = IDX_ACCOUNT)
@Column(unique = true, nullable = false)
private String account; private Date createdOn;
//.....省略
}
1.@Entity是处理的标记 @Id作为table主健
2.@Column 映射列属性,如自定义列名,是否唯一,不能为NULL等
3.@Index 生成索引
4.@NamedQuery 绑定hql语句
小结:只要在原对象结构基础上加上注解,无破坏性,优雅的方式就能实现复杂的功能,还有个好处就是硬编译写在class上的,不用每次调用再去执行其它IO处理,一切尽在掌握之中
[编织消息框架][JAVA核心技术]annotation基础的更多相关文章
- [编织消息框架][JAVA核心技术]异常基础
Java异常体系结构 Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常. 其中异常类Exception又分为运行时异常(RuntimeExcept ...
- [编织消息框架][JAVA核心技术]动态代理应用12-总结
动态代理这篇比较长,是框架组成的重要基础 回顾下学到的应用技术 1.异常应用 2.annotation技术 3.数值与逻辑分享 4.jdk.cglib.javassist等动态代理技术 5.懒处理.预 ...
- [编织消息框架][JAVA核心技术]动态代理应用4
基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...
- [编织消息框架][JAVA核心技术]动态代理应用4-annotationProcessor
基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...
- [编织消息框架][JAVA核心技术]动态代理应用5-javassist
基础部份: 修改class我们用到javassist,在pom.xml添加 <properties> <javassist.version>3.18.2-GA</java ...
- [编织消息框架][JAVA核心技术]异常应用
QException是项目业务异常基类 按模块划分子类异常,方便定位那块出错 有个来源码属性code作用定位某个功能处理出错逻辑,数字类型节省内存空间,同时减少创建子类的子类 QSocketExcep ...
- [编织消息框架][JAVA核心技术]动态代理介绍
由于java是种强类型静态语言,在执行时无法动态生成代码,静态语言基本都有这特性 动态生成代码有几种好处,也是弱类型语言的优点 1.部份逻辑可以实现热更新 2.远程调用实现非常适合 3.能动态生成扩展 ...
- [编织消息框架][JAVA核心技术]动态代理应用1
前面几篇介绍,终于到了应用阶段啦,我们来做一个RPC来加强学过的知识 做基础核心时先确定解决什么问题,提供什么服务,同将来扩展等 rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服 ...
- [编织消息框架][JAVA核心技术]数值与逻辑分离
为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的 ...
随机推荐
- 使用JSCH框架通过跳转机访问其他节点
之前搞了套远程访问ssh进行操作的代码,最近有需求,需要通过一台跳转机才能访问目标服务.在网上搜了半天,也没找到比较好的例子,就自己翻阅了下JSCH的API.但是看的云里雾里的.联想了下,端口转发的原 ...
- 游标遍历所有数据库循环执行修改数据库的sql命令
MSSQL数据库服务器上有很多类似的数据库,需要将这些数据库统一修改其中的某些表或者某些命令,那么就会想到用游标来遍历. 先来说思路: 1,首先需要查询出所有的数据库: select [name] f ...
- log4j2 项目日志组件
在项目运行过程中,常常需要进行功能调试以及用户行为的跟踪和记录,部分人习惯使用System.out,但这并不建议,它仅仅是使用方便但不便于维护也无扩展性.相比log4j的话,log4j可以控制日志信息 ...
- Express4.x API (二):Request (译)
写在前面 最近学习express想要系统的过一遍API,www.expressjs.com是express英文官网(进入www.epxressjs.com.cn发现也是只有前几句话是中文呀~~),所以 ...
- linux mysql定时备份
项目需要定时备份数据库,以下是自己的操作笔记 1.检查磁盘空间 # df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G 3.6 ...
- jdk7jdk8新特性概述
在oracle停止对jdk6更新,jdk8发布之后,公司终于要把生产环境更新到jdk7,下面列一下jdk7,8的可能需要关注的新特性. jdk7 G1垃圾回收 fork-join框架 二进制变量 Sw ...
- Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)
Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效) 前言 今天在使用Spring cache的Cacheable注解的过程中遇见了一个Cacheable注解失效的问题, ...
- 编译器 STVD 与 IAR 的差别 个人体验
编译器 STVD 与 IAR 的一些差别,这些事个人的体验,欢迎扔砖和指点或者补充. 1:全局查找功能: STVD:全局查找功能全局查找功能比較麻烦.有3个动作. IAR:有全局查找功能比較方便.仅仅 ...
- Flex/AS3 base64指定字符编码
public static function base64Encode(str:String, charset:String = "GBK"):String{ if(StringU ...
- OC对象与Core Foundation对象的转换
OC对象使用了ARC,自己主动释放内存,可是CF中的对象没有ARC,必需要手动进行引用计数和内存释放. 两者对象之间的互相转换有三种形式: 1.__bridge: 直接转换,部改变对象的持有状况: i ...