应用动态代理技术要先掌握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基础的更多相关文章

  1. [编织消息框架][JAVA核心技术]异常基础

    Java异常体系结构 Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常. 其中异常类Exception又分为运行时异常(RuntimeExcept ...

  2. [编织消息框架][JAVA核心技术]动态代理应用12-总结

    动态代理这篇比较长,是框架组成的重要基础 回顾下学到的应用技术 1.异常应用 2.annotation技术 3.数值与逻辑分享 4.jdk.cglib.javassist等动态代理技术 5.懒处理.预 ...

  3. [编织消息框架][JAVA核心技术]动态代理应用4

    基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...

  4. [编织消息框架][JAVA核心技术]动态代理应用4-annotationProcessor

    基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...

  5. [编织消息框架][JAVA核心技术]动态代理应用5-javassist

    基础部份: 修改class我们用到javassist,在pom.xml添加 <properties> <javassist.version>3.18.2-GA</java ...

  6. [编织消息框架][JAVA核心技术]异常应用

    QException是项目业务异常基类 按模块划分子类异常,方便定位那块出错 有个来源码属性code作用定位某个功能处理出错逻辑,数字类型节省内存空间,同时减少创建子类的子类 QSocketExcep ...

  7. [编织消息框架][JAVA核心技术]动态代理介绍

    由于java是种强类型静态语言,在执行时无法动态生成代码,静态语言基本都有这特性 动态生成代码有几种好处,也是弱类型语言的优点 1.部份逻辑可以实现热更新 2.远程调用实现非常适合 3.能动态生成扩展 ...

  8. [编织消息框架][JAVA核心技术]动态代理应用1

    前面几篇介绍,终于到了应用阶段啦,我们来做一个RPC来加强学过的知识 做基础核心时先确定解决什么问题,提供什么服务,同将来扩展等 rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服 ...

  9. [编织消息框架][JAVA核心技术]数值与逻辑分离

    为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的 ...

随机推荐

  1. 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)

    首先,展示一下封装好之后的项目的层级结构. 1.先创建一个RetrofitApiService.java package com.xdw.retrofitrxmvpdemo.http; import ...

  2. IntelliJ IDEA(二) :面板介绍

    一.面板说明 IDEA面板的全貌如下图 二.菜单栏 下面会简单介绍下一些常用的部分菜单使用,如有疑问或补充欢迎留言. (1).File文件 1. New:新建一个工程 可以新建project,导入已存 ...

  3. haproxy,tomcat.apache记录用户真实IP

    Haproxy配置: default加入: option httpclose option forwardfor Tomcat配置: server.xml中添加 prefix="localh ...

  4. 关于在linux下清屏的几种技巧(转载-备忘)

    原文地址:http://www.cnblogs.com/5201351/p/4208277.html 在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢 ...

  5. backbone与require的共存问题解决

    如果向下面那样直接列出script标签可能会出现错误,   <script type="text/javascript" src="/dep/jquery-1.11 ...

  6. Weka学习 -- StringToWordVector 源代码学习(1)

    代码整个运行流程 參数设置 input数据,设置数据格式 batchFinished(),处理数据(Tokenzier,Stemming,Stopwords) determineDictionary( ...

  7. logstash 向elasticsearch写入数据,怎样指定多个数据template

    之前在配置从logstash写数据到elasticsearch时,指定单个数据模板没有问题.可是在配置多个数据模板时候,总是不成功,后来找了非常多资料,最终找到解决的方法,就是要多加一个配置项: te ...

  8. 腾讯云安全:移动 APP 安全行业报告

    移动 APP 已逐步渗透入我们的生活,据统计,2016年,APP 发行数量仅电商.金融.游戏这三大类共计高达2万左右,国内移动互联网活跃用户数已经突破10亿,移动互联网这样快速的推移,移动互联网的安全 ...

  9. angular封装七牛云图片上传,解决同一页面多个上传按钮分别上传

    step1:引入文件 引入Plupload *该SDK上传功能集于Plupload插件封装,所以需要下载Plupload; plupload.dev.js 引入qiniu.js为了简便,当时直接从官网 ...

  10. Cenos 6.5上的subverion的yum配置笔记

    Subversion在CenOS 6.5上的安装配置 1.安装 yum install subversion 2.配置   #创建目录   mkdir /opt/svn   #创建版本库   svna ...