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

在Spring中同时使用了Annotation配置和XML配置,spring优先使用哪一个
新近接触了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上如果有人研究过,不妨也分享一下经验吧。