[编织消息框架][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核心技术]数值与逻辑分离
为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的 ...
随机推荐
- mysql分区分表
为毛要分表和分区,,,,所有数据库的通病,文件越大,性能越低...那问题就来了.数据越多文件越大...无解?哎,所以说知道 为毛要分区了吧!那分表又是毛线?分表就是把一张表拆分成若干表,,,根据情况常 ...
- 局域网下的html注入及DNS劫持
之前研究Dsploit的部分功能实现原理,现在了解的差不多了,简要记录下Dsploit的断网攻击,html注入,图片替换,cookie劫持的原理.本篇blog需要有一定的网络知识基础在看. 假设现有三 ...
- Git基本使用命令(windows)
1. 记住一个名词repository版本库 =======================基本操作======================== git init 在需要的地方建立一个版本库(也 ...
- 浅谈 Integer 类
在讲解 Integer 之前,我们先看下面这段代码: public static void main(String[] args) { Integer i = 10; Integer j = 10; ...
- form表单提交和ajax提交优先级
form中若定义action,那么,ajax将不能执行.form默认提交的请求优先级高于ajax
- iOS日历中给一个事件加入多个提醒
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) iOS自带的日历应用中,我们最多仅仅能给一个事件设置2个提醒, ...
- MongoDB学习笔记<一>
今天学习了shell的主要的操作,例如以下: 1.创建一个数据库foobar use foobar 2.给指定的数据库加入集合,并加入记录 db.person.insert({"name&q ...
- Java加载资源文件的两种方法
处理配置文件对于Java程序员来说再常见不过了,不管是Servlet,Spring,抑或是Structs,都需要与配置文件打交道.Java将配置文件当作一种资源(resource)来处理,并且提供了两 ...
- 【Jquery系列】JqGrid参数详解
1 概述 本篇文章主要与大家分享JqGrid插件参数问题. 2 参数详解 2.1 初始化参数 2.2 ColModel参数 3 json数据 jqGrid可支持的数据类型:xml.jso ...
- ML02: 机器学习KNN 算法
摘要: 一张图说清楚KNN算法 看下图,清楚了吗? 没清楚的话,也没关系,看完下面几句话,就清楚了. KNN算法是用来分类的. 这个算法是如何来分类的呢? 看下图,你可以想想下图中的 『绿色圆点』 ...