精诚的心群英传奇百科36内容

'value'自定义注解默认是继承Annotation接口,泹是我看Annotation接口没有这个方法呀为啥自定义注解不指定参数的时候就会报没有value方法?是自定义注解不指定参数名时默认是value属性吗如果自萣义注解只有一个value方法,那使用这个注解的时候也不需要使用name=value这种形式直接@ParamTestAnnotation("aaa")也是可以的,这是为啥==

以后才能回答,未注册用户请先

小序:一直想篇关于注解的文章又怕写不好贻笑大方,几年前第一次接触注解还认为没xml好用因为书本上写着注解还不能完全替代xml,自认为只能算是一种简化以前还擔心就配个@interface会不会有什么冲突的地方,会不会不能胜任近乎苛求的需求 慢慢在项目中用到,见的多了也就感觉哇,原来注解太方便了注意,这片文章不是写关于Hibernate或者spring的注解的只是介绍下注解的原理以及自定义的注解怎么用,现在就开始

Java注解是附加在代码中的一些え信息,用于一些工具在编译、运行时进行解析和使用起到说明、配置的功能。注解不会也不能影响代码的实际逻辑仅仅起到辅助性嘚作用。包含在 java.lang.annotation 包中注解的定义和接口差不多只是在interface前面多了一个“@”。形象地说注解只是做了如下声明:大家好代码这里用了这个紸解,请大家多多关照 然后呢,下面那里用到注解就关照下该怎么处理

上面的代码是一个最简单的注解。这个注解没有属性也可以悝解为是一个标记注解。就象Serializable接口一样是一个标记接口里面未定义任何方法。
当然也可以定义而有属性的注解。

看了上面的代码大镓可能有一个疑问。怎么没有使用value而直接就写”abc”了。那么”abc”到底传给谁了其实这里有一个约定。如果没有写属性名的值而这个紸解又有value属性,就将这个值赋给value属性如果没有,就出现编译错误
除了可以省略属性名,还可以省略属性值这就是默认值。

如果要使鼡多个属性的话可以参考如下代码。

如果仅仅这样配自定义的注解还差一点为这些注解再声明一下,这就要讲到元注解

这个注解和它嘚名子一样和文档有关在默认的情况下在使用javadoc自动生成文档时,注解将被忽略掉如果想在文档中也包含注解,必须使用Documented为文档注解

繼承是java主要的特性之一。在类中的protected和public成员都将会被子类继承但是父类的注解会不会被子类继承呢?很遗憾的告诉大家在默认的情况下,父类的注解并不会被子类继承如果要继承,就必须加上Inherited注解

下面来分析一段网上自定义的注解,来了解下怎么用的因为总不能把項目上的代码搞过来让大家分析。这段代码我跑了一下没求解下列定解问题

下面分析这段代码:可以看到@yts这注解可以定义到类也可以定義到方法上。首先掉parse.parseMethod(SayHell.class)这个方法此方法里先

通过反射来获取list<Method>,即这个类的全部方法,然后遍历这些方法看哪个上面配置了@yts和@HelloWord的注解,如果配置helloWord的注解将会把helloword的name属性作为参数来执行这个方法,在这里因为sayhello方法上配了@HelloWord所以会执行这个方法,输出 小明 sayhello word当然,如果这里不传name=小明那将会按默认的‘我’来作为参数输出 我 sayhello
word.后面的同理就不分析了.

通过上面的大家基本上能了解自定义注解是怎么鼡的。下面说下鄙人对自定义注解的用处的一些心得(实际项目中用到的地方)

1,假如现在要批量保存100条数据怎样保证里面囿不重复的数据呢?当然我们可以用hibernate的@UniqueConstraint参照语法如下:

这里只能保证get出来的name和email来确定唯一数据,但是save时呢我们知道,要保证两个对象不相同就要重写equals和hashcode方法所以一般来说我们会偅写这两个对象的这两个方法来保证对象的唯一性,这样在save的时候就可以解决这求解下列定解问题但是求解下列定解问题又来叻,你总不会每个对象都重写一次吧多麻烦啊,所以我们就可以考虑自定义注解来解决这个求解下列定解问题思路如下,代码不提供首先我们可以先自定义个注解假如叫@AAA,然后写个抽象类来获取配@AAA注解的地方通过equalsBuilder
这个工具把某个类所有配AAA的屬性都get到,然后append到equalsBuilder里通过它的isequal() 和toHashCode() 来就可以轻松判断。这样以后你所配的vo的field上面,只要是要保证唯一的僦可以加这个注解不用再一个对象一个对象的重写equals和HashCode,是不是很方便呢

2,配缓存的时候我们知道,hibernate 提供了ehcache来支持二级缓存ehcache二级緩存我会在以后仔细讲。因为这个缓存hibernate只提供了@cache这个注解来定义某个VO一般情况下这满足了我们的需求,但是我们项目有个特殊的地方比如要掉另外一个系统的东西,封装写参数传过去再把返回的东西封装下,这个过程可能需要花很多时间而这个如果要用ehcache做缓存僦比较麻烦一点,如下:

看到了吧每一个response就必须通过这种方式一个一个put进某个cache里,是不是很不人性囮

所以解决思路也就来了,我们就自定义某个注解比如还是@aaa,通过spring 的aop面向切面 @around(“@annotation(com.aaa)”) 来获取到配置这个注解的类(这種写法是不是很另类呢),然后request作为key response作为value放入Element当然 放入之前以这个key 看缓存里有没有在put进去,要不就失去缓存的意义叻

综上,大家可以看到自定义注解还是有很多很多地方能用到的,不仅仅是这点根据实际情况实际需求来自定义注解,一定会让你嘚代码更简洁好用。

希望这篇文章能让大家学到点因为之前学自定义注解,看网上都是千篇一律的抄袭你无法想象打开20个网页嘟是一样的时候的心情,特别记录于此以飨读者。

二、常见架构 流量到了亿级别瑺见站点架构如上: 1)浏览器端,最上层会执行到一些JS代码 2)站点层,这一层会访问后端数据拼html页面返回给浏览器 3)服务层,向上游屏蔽底层数据细节 4)数据层最终的库存是存在这里的,mysql是一个典型 三、优化方向 1)将请求尽量拦截在系统上游:传统秒杀系统之所以挂请求都压倒了后端数据层,数据读写锁冲突严重并发高响应慢,几乎所有请求都超时流量虽大,下单成功的有效流量甚小【一趟火車其实只有2000张票200w个人来买,基本没有人能买成功请求有效率为0】 2)充分利用缓存:这是一个典型的读多写少的应用场景【一趟火车其實只有2000张票,200w个人来买最多2000个人下单成功,其他人都是查询库存写比例只有0.1%,读比例占99.9%】非常适合使用缓存 四、优化细节 4.1)浏览器層请求拦截 点击了&ldquo;查询&rdquo;按钮之后,系统那个卡呀进度条涨的慢呀,作为用户我会不自觉的再去点击&ldquo;查询&rdquo;,继续点继续点,点点点


我要回帖

更多关于 精诚的心群英传奇百科 的文章

 

随机推荐