`

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


1
4
分享到:
评论

相关推荐

    Spring的Annotation配置相关讲义

    在Spring框架中,Annotation配置是一种简洁且强大的方式来管理Bean的定义和依赖注入,它消除了传统的XML配置文件,使得代码更加简洁、易读。在Spring 3.0及以上版本中,Annotation配置得到了广泛的应用。 首先,...

    spring和Mybatis的xml配置文件提示约束包

    "spring和Mybatis的xml配置文件提示约束包"这个主题,主要是关于在XML配置文件中使用的DTD(Document Type Definition)文档类型定义,它为XML文件提供了结构约束和语法规范。 DTD是一种元语言,用于定义XML文档的...

    Spring Annotation简介一

    Spring Annotation是Spring框架中的一个重要特性,它极大地简化了配置,提高了代码的可读性和可维护性。这篇博客将深入探讨Spring Annotation的基础知识,以及如何在实际项目中应用。 Spring Annotation的引入主要...

    配置整合DWR3.0和Spring2.5使用annotation注解

    在下面的代码中,我们创建了一个名为`UserController`的类,它同时被`@Controller`和`@RemoteProxy`注解标记: ```java package com.myapp.web.controller; import javax.servlet.http.HttpServletRequest; import...

    spring基于task标签和通过xml配置实现任务的区别

    你可以在Spring配置文件中直接声明`&lt;task:annotation-driven/&gt;`来启用对`@Scheduled`注解的支持。 - 使用`@Scheduled`注解,可以直接在方法上定义调度规则,如cron表达式或固定延迟,使得任务代码和配置更加紧密...

    扩展Spring—使用Annotation将配置资源注入到Bean中

    在Spring框架中,注解(Annotation)的使用极大地简化了传统XML配置的复杂性,使得开发者可以更加专注于业务逻辑的实现。本篇文章将深入探讨如何通过注解将配置资源注入到Bean中,以此来理解Spring的注解驱动开发。 ...

    spring xml 定时任务

    在Spring框架中,XML配置是传统且广泛使用的方式来设置应用的组件和行为,包括实现定时任务。定时任务在软件开发中扮演着重要角色,它允许应用程序在预设的时间执行特定的任务,例如数据清理、日志归档或者发送通知...

    spring 的Annotation方式

    - **`@Component`**:这是一个通用注解,适用于任何层次的组件,当不确定使用哪一个特定注解时,可以选择`@Component`。 #### 自动扫描与Bean注册 为了使Spring框架能够识别并注册带有上述注解的类,需要在配置...

    Spring中Aop的使用包括xml和注解

    这里我们将深入探讨两种在Spring中实现AOP的方式:XML配置和注解配置。 首先,让我们来看看**XML配置AOP**。在Spring的早期版本中,XML配置是主要的配置方式。在`spring-aop-xml`中,你可能会看到以下关键元素: 1...

    学习Spring笔记_AOP_Annotation实现和XML实现

    这篇“学习Spring笔记_AOP_Annotation实现和XML实现”主要探讨了如何在Spring中利用注解和XML配置来实现AOP的概念。 AOP,全称Aspect-Oriented Programming,是一种编程范式,旨在将关注点分离,让开发者可以更专注...

    spring applicationContext.xml详细配置

    在Spring框架中,`applicationContext.xml`是核心配置文件,用于定义bean的声明、依赖注入、数据源配置、事务管理等。...在`springtest2`这个项目中,这些概念和配置将共同作用,构建出一个完整的Spring应用。

    Spring annotation

    Spring框架是Java开发中不可或缺的一部分,它通过提供丰富的注解简化了依赖注入、配置管理和AOP(面向切面编程)等任务。本文将深入探讨Spring注解及其在实际开发中的应用。 1. **依赖注入(Dependency Injection, ...

    SpringMVC基于代码的配置方式(零配置,无web.xml)

    在基于代码的配置中,我们不再需要在web.xml中配置,而是通过Spring的@Configuration和@EnableWebMvc注解来实现。不过,由于Spring Boot的自动配置,通常我们并不需要显式地添加@EnableWebMvc,因为已经默认开启了。...

    SpringMVC Spring MyBatis 框架整合 Annotation Maven Project

    在这个项目中,使用Annotation配置代替了传统的XML配置,使得配置文件更简洁,代码更易于理解和维护。Spring的@Component、@Service、@Repository和@Controller等注解用于标记Bean,而@Autowired注解实现自动装配。...

    spring 2.0使用AOP实例(基于Annotation的配置方式)

    以上就是Spring 2.0中使用AOP的一个基本实例,基于注解的配置方式使得AOP的使用更加直观和简洁。在实际开发中,我们可以根据需求灵活地定义切面和通知,以实现各种横切关注点的功能。 通过阅读提供的压缩包中的`src...

    spring_annotation maven 的配置

    Spring Annotation和Maven的结合使用是现代Java项目中常见的配置方式,它们为开发者提供了高效、灵活的开发环境。本篇文章将深入探讨Spring注解和Maven的配置及其重要性。 **Spring注解** Spring注解是Spring框架...

    Spring基于注释(Annotation)的配置.pdf

    ### Spring基于注释...`&lt;context:annotation-config/&gt;`是Spring提供的一个配置选项,它可以自动注册多个BeanPostProcessor,包括`AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`...

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...

    Spring使用XML配置声明式事务

    在XML配置文件中(通常是`applicationContext.xml`),我们需要声明一个`&lt;tx:annotation-driven&gt;`标签来启用基于注解的事务管理。这个标签告诉Spring容器自动检测带有@Transactional注解的类,并根据注解中的属性...

Global site tag (gtag.js) - Google Analytics