分享
 
 
 

侵入,无侵入? Annotation vs Interface

王朝other·作者佚名  2006-11-08
窄屏简体版  字體: |||超大  

作者:江南白衣

本文出自SpringSide wiki,请留意Wiki中的最新版本

1. Interface

使用Interface 定义对象的类型,框架根据对象的接口来提供服务,这种模式是古而有之的Java框架设计者必习之法,从最重量的EJB到最轻量的Spring,都离不开这种方式,也的确解决了很多问题。比如在大家熟悉的Spring里:

BeanFactoryAware接口,框架看到它就会调用Bean的setBeanFactory(BeanFactory beanFactory) 函数,将BeanFactory传给它,让它自行用BeanFactory获得更多Bean,而不仅限于依赖注入的Bean。

FactoryBean接口,框架看到它就不会把这个Bean放入自己的Context,而是调用它的getObject()函数,将返回的结果作为Bean放入。Spring里很多功能依赖于这个扩展机制,因为它可以用Factory模式返回任意类型对象,而不是<bean class="foo">中class指定类型。

InitializingBean接口,因为很多Bean在各setter注入后,还需要一个总的init函数进行初始化,比如需要同时根据注入的属性A和 B,来初始化属性C的值。这时候框架就会调用afterPropertiesSet() 初始化。

等等,最后一个InitializingBean接口很邪恶阿!!硬要POJO实现一个名字怪怪的afterPropertiesSet()函数,侵入得不能再侵入阿。

2. 无侵入

所以,Spring提供了另一种方式,在配置文件里定义初始方法的名字: <bean class="foo" init-method="init"/>

其实Spring提倡的无侵入有两种层次:

一种是像Quartz,JMX,WebService这些模块,POJO啥都不用做,Spring使用AOP,FactoryBean这样的机制使它们白日飞升具备了WebService,定时执行的能力。

一种是像init-method的例子,POJO并不很明显的实现Spring的接口,知觉Spring的存在,自己实现自己的函数,然后由Spring的配置文件去调用它们。

前一种无侵入的作用非常明显,后一种的意义就看具体的场景了,有时候实现一下Spring的接口也没什么所谓,但有时候各种原因会希望不显式的实现接口。

3. Annotation

在JDK5新增了Annotation的模式。Annotation 模式是XML模式的竞争者,但题目太大本篇就不讨论了,我的观点是主要看数据属于配置数据还是代码元数据。

本文forcus Interface vs Annotation来定义对象类型和行为。

最开始用Annotation 使Java代码不再那么受传统模式局限的是TestNG,然后JUnit 4紧跟其后,在默认机制之外,可以用annotation 来灵活定义setup函数和测试函数。

4. 对比演示

下面,我们以SpringSide里的UndeleteEntity接口和@Undelete 标识的实现,具体演示一下两者。

需求是如果把Entity对象定义为不能删除,则基类的remove函数就不会真正删除该对象,而是设置状态列为"无效"。

Interface是这样实现的:

Interface 定义:

public interface UndeletableEntity {

void setStatus(String status);

}

Interface 在Entity使用:

public class Book implements UndeletableEntity {

private String status; public void setStatus(String status) {

this.status = status;

}

}

Interface 在框架中使用:

//根据Class 判断

if(UndeletableEntity.class.isAssignableFrom(entityClass)){

...

}

//根据Bean实体判断

if(bean instanceof UndeletableEntity{

((UldeletableEntity)bean).setStatus("-1");

}

大家都很熟悉的写法,就不解释了。

Annotation是这样实现的:

Annotation 定义:

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

public @interface Undeletable {

String status() default "status";

}

原本怪Sun怎么这么抠门,用@interface 而不另外搞一个关键字,原来Sun的意思就是把Interface和Annotation的定位一样呀。

@Target 定义Annotation 可用于的地方,比如类型,函数,函数参数等。Type代表Class,Interface...

@Retention(RetentionPolicy.RUNTIME)表明是个运行期的annotation,否则后面的代码都不会起作用。

String status() 定义了annotation有个status的属性,而且可以不定义,默认为status。

Annotation在Entity使用:

@Undeletable

public class Book{

private String status;

public void setStatus(String status) {

this.status = status;

}

}

@Undeletable(status = "status2")

public class BookWithNewStatus {

private String status2;

public void setStatus2(String status2) {

this.status2 = status2;

}

}

Annotation在框架中的使用:

if (entityClass.isAnnotationPresent(Undeletable.class)) {

Undeletable anno = (Undeletable) entityClass.getAnnotation(Undeletable.class);

statusProperty = anno.status();

}

可见,annotation的模式,比interface要少一点侵入性,不定死status列的名称,而且还可以灵活定义更多元属性,比如定义无效时的值为"-1","unvalid"。

但是,这种模式也和所有动态的东西向一样,失去了编译期校验的优势,POJO如果没有setStatus() 这个函数在编译期也检查不出来。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有