iteye_19759 2011-01-25 18:10
浏览 364
已采纳

在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上如果有人研究过,不妨也分享一下经验吧 :)





问题补充

谢谢

我感觉这些产品在设计的时候,可能已经考虑到了Annotation的局限,所以额外提供了XML的方式用于弥补。但是我并没有深究官方文档以确认是否如此。

Spring和EJB3能这样实现,再好不过了。


魔力猫咪 写道
Spring和EJB3的规则是只有注解的时候用注解配置。注解和XML同时存在的时候,以XML为准。

  • 写回答

2条回答 默认 最新

  • iteye_12540 2011-01-25 18:10
    关注

    Spring和EJB3的规则是只有注解的时候用注解配置。注解和XML同时存在的时候,以XML为准。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘