[转载]侵入,无侵入? Annotation vs Interface

侵入,无侵入? Annotation vs Interface

1. Interface

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

  • BeanFactoryAware 接口,框架看到它就会调用Bean的setBeanFactory(BeanFactory beanFactory) 函数,将BeanFactory 传给它,让它自行用BeanFactory获得更多Bean,而不仅限于依赖注入的Bean。
  • FactoryBean接口,框架看 到它就不会把这个Bean放入自己的Context,而是调用它的getObject()函数,将返回的结果作为Bean放入。Spring里很多功能依 赖于这个扩展机制,因为它可以用Factory模式返回任意类型对象,而不是中class指定类型。
  • InitializingBean接口,因为很多Bean在各setter注入后,还需要一个总的init函数进行初始化,比如需要同时根据注入的属性A和 B,来初始化属性C的值。这时候框架就会调用afterPropertiesSet() 初始化。

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

2. 无侵入

所以,Spring提供了另一种方式,在配置文件里定义初始方法的名字:

其实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函数就不会真正删除该对象,而是设置状态列为"无效"。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-131192/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-131192/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值