Spring Annotation is dead

本文章基于《使用 Spring 2.5 注释驱动的 IoC 功能

今天花了大半天时间来研究了一下Spring的Annotation用于配置应用,发现一个问题,就是清单 12 ~ 清单 15 的那种情况:

在 beans.xml 中配置两个 Office 类型的 Bean

在这种情况下,需要使用自动注入的策略为byName 的@Qualifier,就拿里面的@Qualifier("office")为例,如果我以

后因为业务变动,要更换一个Office类的实例,暂时取名为office2010这时我该怎么办?由于

applicationContext.xml里的ref="office"被代码里的@Qualifier("office")取代了,因此我只好通过下面两种

方式来解决:

1.先在代码里面找@Qualifier,然后将代码里的"office"改成"office2010"。

2.先在代码里面找@Qualifier,然后将xml里的"office2010"修改为"office",并将原来的"office"删除。

3.在源代码中设置一个变量用来表示@Qualifier的入参,并托管给applicationContext.xml,以后在XML里修改。

方案1显然是入侵式的,简直和没用IOC之前的代码如出一辙,不停地修改源代码,编译,运行。

方案2虽然不是入侵式的,但是要不停地在源代码里查找@Qualifier,然后将我想使用的更有意义的名字“被重命名”

为具备低可读性的旧名字,你累不累啊!就像被OOXX了一样。

方案3等会再说

 

再来看看我们没有使用Spring Annotation来完成配置之前,生活是多么美好,所有的操作都是在一个

applicationContext.xml文件里完成的,查找id="boss"的bean,查看它的name="office"的属性,将

ref="office"修改为ref="office2010",多么简单!根本就不用管源代码。再来看看我们的方案3,且不说@Qualifier是否支持

用变量来设置入参,就算支持,光对比一下,就觉得方案3比老方案繁琐得多。

 

究其原因,是因为Spring团队有点滥用Annotation。Annotation的本质是什么?是重用代码生成过程,比如一个for(:),这个语法真正需要改变的是那里?显然只是:前后的两个变量,而for(:){}这些字符显然是不会变的,完全可以通过一个标签+对应的生成过程来实现,并

且这个标签+生成过程完全可以重用。这里的标签+对应的生成过程就是Annotation。那么将Annotation应用于配置Application时,会出

现什么问题呢?显然用Annotation生成的结果往往具有一次性,要想改变,就得重新输入metaData.而application往往时刻面临着改

变,将一次性的结果应用于时刻面临着改变的东西上,结果可想而知!

 

因此我觉得,Annotation应该应用于仅仅发生细小改变的代码的生成,而不应该应用于配置应用程序。不过看看题目,觉得应该是

Spring Annotation配置应用程序 is dead,而不是Spring Annotation is dead.但是为了让更多的高人来指正我,我决定不改了。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值