新近接触了SpringMVC3.0,从个人感觉来讲我非常喜欢。之所以从3.0版本才开始学习,也是对于旧版本的XML配置有所忌惮。SpringMVC从2.5版本引入了annotation,到了3.0有了进一步增强。
参考了文章http://bulargy.iteye.com/blog/179781的一些观点,我也觉得有时候Annotation较之于XML-configuration有其固有的限制。混搭比较好,比如说想在发布环境上动态修改接口的具体实现,但是不想重新编译Java代码的情况下。
为了同时能够利用到XML和Annotation的优点,我做了一个试验,想验证当我同时在XML和Annotation中声明了同样id的一个bean组件,spring会优先为我找哪一个?
在我的试验中,有一个接口,以及两个实现类,分别如下:
public interface CircularReferenceService {public Set<Long> getAncestorTrxIDs(Long linkStartFrom); ... ...
@Service("circularCheckingService")
@Transactional(readOnly=true)
public class CircularReferenceServiceImpl implements CircularReferenceService {private GenericDao<TrxDef, Long> trxDefDao; private GenericDao<TrxDefLink, Long> trxDefLinksDao; @Autowired public void setDao(GenericDao<TrxDef, Long> trxDefDao, GenericDao<TrxDefLink, Long> trxDefLinksDao) { this.trxDefDao = trxDefDao; this.trxDefLinksDao = trxDefLinksDao; } public List<TrxDef> getAllLinkableTrxDef(Long linkStartFrom) { Set<Long> excludeIDs = getAncestorTrxIDs(linkStartFrom); if(linkStartFrom != null) { ... ...
@Service("circularCheckingOracleNativeService")
@Transactional(readOnly=true)
public class CircularReferenceServiceOracleNativeImpl implements CircularReferenceService {private NativeDao nativeDao; @Autowired public void setDao(NativeDao nativeDao) { this.nativeDao = nativeDao; } public List<TrxDef> getAllLinkableTrxDef(Long linkStartFrom) { ... ...
使用Annotation,在Java代码中,用法大致是这样。在这里是以byName的方式,连接相应的组件,"name=circularCheckingService"对应的是CircularReferenceServiceImpl实现,而"name=circularCheckingOracleNativeService"对应的是CircularReferenceServiceOracleNativeImpl实现
......
@Resource(name="circularCheckingService")
public void setCircularCheckingService(CircularReferenceService circularService) {
this.circularService = circularService;
}
......
这里的问题是,如何既能保留annotation的便利,又能结合XML的灵活性,不通过重新编译代码能够变更接口实现。
于是我在XML配置文件里面增加了一行,尝试覆盖Annotation中指定的CircularReferenceServiceImpl实现。
<bean id="circularCheckingService"
class="foo.bar.CircularReferenceServiceOracleNativeImpl" />
我用的环境是 英文windows xp, jdk1.5, tomcat6.0.28,在我本地电脑上,XML的配置能够覆写Annotation的配置。
但是我没有在Spring官方文档上找到这样的说明以验证我的试验是否有偶然性,如上述用法是否有副作用。我通过重启tomcat的方法,试验了6,7次,试验结果是一致的。
这个问题我留到后面时间更加允许的时候准备继续考证一下,不过JavaEye上如果有人研究过,不妨也分享一下经验吧 :)
问题补充
谢谢
我感觉这些产品在设计的时候,可能已经考虑到了Annotation的局限,所以额外提供了XML的方式用于弥补。但是我并没有深究官方文档以确认是否如此。
Spring和EJB3能这样实现,再好不过了。