扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:江南白衣 来源:CSDN 2008年3月17日
关键字: Interface Annotation java
使用Interface 定义对象的类型,框架根据对象的接口来提供服务,这种模式是古而有之的Java框架设计者必习之法,从最重量的EJB到最轻量的Spring,都离不开这种方式,也的确解决了很多问题。比如在大家熟悉的Spring里:
等等,最后一个InitializingBean接口很邪恶阿!!硬要POJO实现一个名字怪怪的afterPropertiesSet()函数,侵入得不能再侵入阿。
所以,Spring提供了另一种方式,在配置文件里定义初始方法的名字: <bean class="foo" init-method="init"/>
其实Spring提倡的无侵入有两种层次:
一种是像Quartz,JMX,WebService这些模块,POJO啥都不用做,Spring使用AOP,FactoryBean这样的机制使它们白日飞升具备了WebService,定时执行的能力。
一种是像init-method的例子,POJO并不很明显的实现Spring的接口,知觉Spring的存在,自己实现自己的函数,然后由Spring的配置文件去调用它们。
前一种无侵入的作用非常明显,后一种的意义就看具体的场景了,有时候实现一下Spring的接口也没什么所谓,但有时候各种原因会希望不显式的实现接口。
在JDK5新增了Annotation的模式。Annotation 模式是XML模式的竞争者,但题目太大本篇就不讨论了,我的观点是主要看数据属于配置数据还是代码元数据。
本文forcus Interface vs Annotation来定义对象类型和行为。
最开始用Annotation 使Java代码不再那么受传统模式局限的是TestNG,然后JUnit 4紧跟其后,在默认机制之外,可以用annotation 来灵活定义setup函数和测试函数。
下面,我们以SpringSide里的UndeleteEntity接口和@Undelete 标识的实现,具体演示一下两者。
需求是如果把Entity对象定义为不能删除,则基类的remove函数就不会真正删除该对象,而是设置状态列为"无效"。
Interface 定义:
Interface 在Entity使用:
Interface 在框架中使用:
大家都很熟悉的写法,就不解释了。
Annotation 定义:
原本怪Sun怎么这么抠门,用@interface 而不另外搞一个关键字,原来Sun的意思就是把Interface和Annotation的定位一样呀。
@Target 定义Annotation 可用于的地方,比如类型,函数,函数参数等。Type代表Class,Interface...
@Retention(RetentionPolicy.RUNTIME)表明是个运行期的annotation,否则后面的代码都不会起作用。
String status() 定义了annotation有个status的属性,而且可以不定义,默认为status。
Annotation在Entity使用:
Annotation在框架中的使用:
可见,annotation的模式,比interface要少一点侵入性,不定死status列的名称,而且还可以灵活定义更多元属性,比如定义无效时的值为"-1","unvalid"。
但是,这种模式也和所有动态的东西向一样,失去了编译期校验的优势,POJO如果没有setStatus() 这个函数在编译期也检查不出来。
BTW. 其实本篇也属于幼学琼林系列,show一下用interface 和 annotation 定义元数据,交给框架去反射的基本写法。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者