在Spring中同时使用了Annotation配置和XML配置,spring优先使用哪一个

新近接触了SpringMVC3.0,从个人感觉来讲我非常喜欢。之所以从3.0版本才开始学习,也是对于旧版本的XML配置有所忌惮。SpringMVC从2.5版本引入了annotation,到了3.0有了进一步增强。

参考了文章[url]http://bulargy.iteye.com/blog/179781[/url]的一些观点,我也觉得有时候Annotation较之于XML-configuration有其固有的限制。混搭比较好,比如说想在发布环境上动态修改接口的具体实现,但是不想重新编译Java代码的情况下。

为了同时能够利用到XML和Annotation的优点,我做了一个试验,想验证当我同时在XML和Annotation中声明了同样id的一个bean组件,spring会优先为我找哪一个?

在我的试验中,有一个接口,以及两个实现类,分别如下:

[code]
public interface CircularReferenceService {

public Set<Long> getAncestorTrxIDs(Long linkStartFrom);

...
...
[/code]


[code]
@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) {
...
...

[/code]



[code]
@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) {
...
...

[/code]


使用Annotation,在Java代码中,用法大致是这样。在这里是以byName的方式,连接相应的组件,"name=circularCheckingService"对应的是CircularReferenceServiceImpl实现,而"name=circularCheckingOracleNativeService"对应的是CircularReferenceServiceOracleNativeImpl实现


[code]
......
@Resource(name="circularCheckingService")
public void setCircularCheckingService(CircularReferenceService
circularService) {
this.circularService = circularService;
}
......
[/code]

这里的问题是,如何既能保留annotation的便利,又能结合XML的灵活性,不通过重新编译代码能够变更接口实现。
于是我在XML配置文件里面增加了一行,尝试覆盖Annotation中指定的CircularReferenceServiceImpl实现。

[code]
<bean id="circularCheckingService"
class="foo.bar.CircularReferenceServiceOracleNativeImpl" />
[/code]

我用的环境是 英文windows xp, jdk1.5, tomcat6.0.28,在我本地电脑上,XML的配置能够覆写Annotation的配置。

但是我没有在Spring官方文档上找到这样的说明以验证我的试验是否有偶然性,如上述用法是否有副作用。我通过重启tomcat的方法,试验了6,7次,试验结果是一致的。

这个问题我留到后面时间更加允许的时候准备继续考证一下,不过JavaEye上如果有人研究过,不妨也分享一下经验吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值